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

Posted

技术标签:

【中文标题】目标 c - 运行代码块 X 秒,但如果条件满足则立即返回【英文标题】:Objective c - Run block of code for X seconds but return immediately if condition satisfies 【发布时间】:2013-08-07 21:29:22 【问题描述】:

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

【问题讨论】:

【参考方案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);
];

【讨论】:

感谢您的反馈。这太棒了。【参考方案2】:

不要阻止或投票。

设置一个 5 秒的计时器

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

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

如果你愿意,你可以invalidate 定时器来阻止它触发。

【讨论】:

感谢您的反馈。我无法正常关注您,请您粘贴示例代码。

以上是关于目标 c - 运行代码块 X 秒,但如果条件满足则立即返回的主要内容,如果未能解决你的问题,请参考以下文章

条件语句和循环语句

Oracle PL/SQL - 如果不满足条件,则退出开始结束块

如果条件不满足,请勿保存工作表

流程控制

PHP / SQL:如果在表A和表B中更新后满足条件,则更新表C

如果满足条件,则替换 Numpy 元素