[英]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];
等待完成块返回的结果几乎没有达到使用完成块的目的!
不应使用计时器检查是否已调用完成功能,而应该在完成功能块中添加一个错误和/或成功参数。
例如:
-(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.