gpt4 book ai didi

ios - 用于完成 block 的Objective-C计时器

转载 作者:行者123 更新时间:2023-12-01 20:17:27 25 4
gpt4 key购买 nike

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

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 says,您可能正在从错误的方向解决此问题。

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

您不应使用计时器来检查是否已调用完成,而应将错误和/或成功参数添加到完成块中。

例如:

-(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);
});

}

关于ios - 用于完成 block 的Objective-C计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36434935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com