-1

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

2 回答 2

1

如果您不想在NO应在 5 秒延迟后返回的情况下阻塞主线程,则异步构造该 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);
}];
于 2013-08-08T11:13:12.973 回答
0

不要阻止或投票。

  • 设置一个 5 秒的计时器

  • 如果满足任何条件,则在 5 秒后检查条件,并在必要时执行失败案例或成功案例

  • 如果您想在完成后立即采取行动,则使用任何各种“在主线程上执行”构造来执行此操作(也设置条件让计时器触发任务已完成)

  • 如果需要,您可以invalidate设置计时器以使其完全不触发。

于 2013-08-07T21:31:33.437 回答