簡體   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