所以情况是我需要运行代码5秒但如果我匹配条件然后希望它立即返回。我在KIF测试步骤中这样做,我不希望这阻止我的应用程序主线程。
示例伪代码 -
+ (BOOL) isVerified:(NSString*)label;
{
if(<condition match>)
return YES;
else if(X seconds not passed)
<make sure m running this function for X seconds>
else // X seconds passed now..
return NO;
}
答案 0 :(得分:1)
如果您想在5秒延迟后返回NO
的情况下阻止主线程,则异步构造该API。
typedef void(^CCFVerificationCallbackBlock)(BOOL verified);
@interface CCFVerifier : NSObject
- (void)verifyLabel:(NSString *)label withCallbackBlock:(CCFVerificationCallbackBlock)block;
@end
static const int64_t ReturnDelay = 5.0 * NSEC_PER_SEC;
@implementation CCFVerifier
- (void)verifyLabel:(NSString *)label withCallbackBlock:(CCFVerificationCallbackBlock)block {
NSParameterAssert(block);
if( [label isEqualToString:@"moo"] )
block(YES);
else {
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, ReturnDelay);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
block(NO);
});
}
}
@end
使用:
_verifier = [[CCFVerifier alloc] init];
[_verifier verifyLabel:@"foo" withCallbackBlock:^(BOOL verified) {
NSLog(@"verification result: %d",verified);
}];
答案 1 :(得分:0)
请勿阻止或投票。
将计时器设置为5秒
如果满足任何条件,请在5秒后检查条件并在必要时执行失败案例或成功案例
如果你想在完成时立即采取行动,那么使用任何各种“在主线程上执行的东西”构造来做到这一点(也设置条件让定时器不发出任务已完成)
如果你愿意的话,你可以invalidate
定时器让它完全不被射击。