ios - 如何在 iOS 设备上测试慢速后台线程

标签 ios multithreading

我正在处理具有奇怪竞争条件的遗留代码。它设置一个后台线程,进入 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,直到主线程在 处理登录。我通过强制后台线程停止足够长的时间让主线程完成执行来重复这个问题。

如何在 iOS 设备上自然地执行此操作?我已经重新设计了代码,但需要找到一种方法来自然地重现此代码以验证修复:)

最佳答案

如果您正在开发基于网络的应用程序,那么可以添加到您的开发和质量流程库中的一件事是 Apple 的 Network Link Conditioner,它可以让您降低网络连接的感知性能,从而引发诸如延迟和时间问题。

关于ios - 如何在 iOS 设备上测试慢速后台线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22915614/

相关文章:

ios - 如何向 MKPointAnnotation 添加按钮并打开 map ?

Python:如何在其中一个线程因错误而中断后添加新线程

java - 当新线程运行时更大的线程池或额外的 ExecutorService?

java - Java Lambdas线程安全

ios - 终止app swift 2后发送本地通知

ios - 如何检查哪些文件存储在 iCloud 上?

ios - 由于访问 Web api 时未捕获异常 'NSInvalidArgumentException' 而导致应用程序终止

iphone - 在数组中使用.jp2图像

multithreading - std::thread 的作用域线程包装器

linux - 多线程游戏程序突然锁定在glXSwapBuffers上