我正在处理具有奇怪竞争条件的遗留代码。它设置一个后台线程,进入handleLogin
然后检测它是否在后台。如果是,那么它在退出时在主线程上调用自己。这会导致后台线程退出方法并设置主线程中使用的变量。我们有报告称用户看到了这种竞争条件可能发生的错误,但是他们始终看到错误。如何强制iOS设备上的后台线程执行速度明显慢于主线程?
相关代码:
- (void)performLogin
{
[AppDelegate instance].condition = 0
if ([NSThread isMainThread])
{
[self performSelectorInBackground:@selector(performLogin) withObject:nil];
return;
}
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//Code to handle Login logic removed//
[self handleLogin];
[AppDelegate instance].condition = 1;
[pool release];
}
- (void)handleLogin
{
if (![NSThread isMainThread])
{
[self performSelectorOnMainThread:@selector(handleLogin) withObject:nil waitUntilDone:NO];
return;
}
...
if ([AppDelegate instance].condition == 0)
{
Perform logic
}
}
具体问题是condition
之前设置为0,代码依赖于它被设置为1才能正常运行。它几乎总是设置为1,因为背景在主线程到达该点之前完成,但我们有报告称,当主线程点击条件时,某些用户始终将condition
设置为0 handleLogin
。我通过强制后台线程停止足够长时间以使主线程完成执行来复制此问题。
如何在iOS设备上自然地执行此操作?我已经重新设计了代码,但需要找到一种方法来自然地重现这个问题以验证修复:)
答案 0 :(得分:2)
如果您正在开发基于网络的应用程序,那么添加到您的开发和质量流程库中的一件事就是Apple的网络链接调节器,它可以降低网络连接的感知性能引发延迟和时间问题等事情。