我正在开发一个在应用程序的主线程中运行的 UI 测试框架(KIF-next)。基本流程是:
- 执行一些测试逻辑。
- 通过 旋转主循环 0.1 秒
runUntilDate:
。 - 重复。
这种方法非常有效。您可以模拟点击事件,您可以在滑块上滑动,观看警报视图动画进出,scrollToRowAtIndexPath:。除了一个特定的场景,拖动滚动视图,一切都很好。
您可以上下拖动滚动视图,但是当您松开手指时,什么也没有发生。此外,其他视图不再识别触摸事件,您所能做的就是拖动滚动视图。
如果此执行模式结束并且代码退出,滚动视图将执行它们的反弹/减速,但这不是一个选项,因为我在执行顺序执行的 ocunit 中工作。
我的问题:为什么会发生这种情况以及可以做些什么来纠正它?
我有两个演示:
演示 1:阻止您的整个应用程序
使用此代码,您可以测试您的应用程序并确认一切正常,直到您滚动。在那之后,没有任何效果。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
while (YES) {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.25]];
}
});
return YES;
}
Demo 2:暂时阻塞
如果将此代码连接到一个按钮,如果您先点击按钮然后滚动,您将看到与上述相同的效果。一旦计时器完成,您将看到您的应用程序恢复生机。
- (IBAction)spinButtonClicked:(id)sender
{
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:5]];
}