目标 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 - 如果不满足条件,则退出开始结束块