繁体   English   中英

用于完成块的Objective-C计时器

[英]Objective-C timer for completion block

我有一个需要完成块的函数。 但是,有可能发生错误,并且完全不会调用完成块。 我想有一个超时计时器来处理未及时调用完成块的情况,因此我仍然可以继续执行其他操作。

void(^completeHandler)(void) = ^
{
    NSLog(@"Complete");
};

//Timer here to check if completeHandler will ever get called in a specific amount of time

[self complete:completeHandler];

正如FreeNickname所说 ,您可能正在从错误的方向解决此问题。

等待完成块返回的结果几乎没有达到使用完成块的目的!

不应使用计时器检查是否已调用完成功能,而应该在完成功能块中添加一个错误和/或成功参数。

例如:

-(void) doSomethingWithCompletion:(void(^)(BOOL success, NSError* error))completion {

    // do something asynchronous

    {
        { // if success
            completion(YES, nil);
        }

        { // if fail
            NSError* error = ...
            completion(NO, error);
        }
    }
}

...


[self doSomethingWithCompletion:^(BOOL success, NSError* error) {

    if (success) { // success
        // do some success stuff
    } else { // fail
        // do some failure stuff
    }
}];

如果您要处理自己要设置超时的请求,则始终可以使用dispatch_after来调度完成块以不成功的参数触发-并将其包装在另一个块中以确保只能被调用一次。 例如:

-(void) doSomethingWithCompletion:(void(^)(BOOL success, NSError* error))completion {

    __block BOOL called = NO;

    void(^completionBlock)(BOOL success, NSError* error) = ^(BOOL success, NSError* error){
        if (!called) {
            completion(success, error);
            called = YES;
        }
    };


    // do something asynchronous

    {
        { // if success
            completionBlock(YES, nil);
        }

        { // if fail
            NSError* error = ...
            completionBlock(NO, error);
        }
    }

    // your timeout
    dispatch_time_t time =  dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC));
    dispatch_after(time, dispatch_get_main_queue(), ^{
        completionBlock(NO, nil);
    });

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM