[英]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.