我有一个需要完成块的函数。但是,有可能发生错误,并且永远不会调用完成块。我想有一个超时计时器来处理未及时调用完成块的情况,因此我仍然可以继续执行其他操作。
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
}
}];
如果您要处理自己要设置超时的请求,则始终可以使用adispatch_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);
});
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句