目标c - 运行X秒代码块,但如果条件满足则立即返回

时间:2013-08-07 21:29:23

标签: objective-c kif

所以情况是我需要运行代码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;
}

2 个答案:

答案 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定时器让它完全不被射击。