ios - 停止由 `performSelector` 在 `viewDidDisappear` 上启动的子线程

标签 ios objective-c multithreading

首先,我意识到我可能是由于错误地解决了之前的问题而导致了这个问题......

ViewController 主线程中,我启动了一个后台线程以使用以下方法从服务器获取更新的数据:

[self performSelectorInBackground:@selector(sampleTask:) withObject:@"CMD" ];

这个过程可能需要 15-30 秒,所以在主线程中我显示了来自 SQLite 数据库的数据的本地缓存(根据上次打开 View 时对服务器的先前请求填充)并重新加载表一次与服务器同步完成。

如果用户在与服务器的同步完成之前导航回此 View ,则后台线程将继续运行直到完成。这本身不是问题,直到用户改变主意并再次返回到该 View 。如果时机合适,会有两个后台线程尝试与服务器同步数据。如果用户这样做几次,线程数就会增加。如果没有在设备上引起其他问题,应用程序最终会崩溃。

  • 有没有办法在像 viewDidDisappear 这样的触发器上停止创建的线程?
  • 或者我应该为共享资源(例如 NSUserDefaults)写一个锁以防止启动新的后台线程?

  • 或者——就像我在第一行中提到的——我是否采用了错误的方法来解决更新本地缓存的问题,这只会导致像这样的进一步问题?

最佳答案

我认为您可以使用简单的 bool 值信号量,它表明某个同步任务正在执行。因此,在执行下一个类似任务之前,您应该检查该信号量。 如果每次都需要 View Controller 的所有实例通用的静态类变量时重新创建 View Controller 。

关于ios - 停止由 `performSelector` 在 `viewDidDisappear` 上启动的子线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21353247/

相关文章:

objective-c - 使用 Shift 键扩展 NSCollectionView 中的选择

objective-c - 是否可以将自定义对象序列化为 Objective-C 中的 plist 文件?

multithreading - 这是在 Delphi 6 中设置线程名称的正确方法吗?

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

java - 同时使用多个AnimationDrawables

ios - 如何使用仪器和 Javascripts 对 iOS 应用程序进行 UI 自动化测试

iphone - 在 MKMapView 中搜索特定的 MKAnnotation 类

ios - 如何使用 ios callkit - 调用目录扩展?

ios - 以编程方式触发摇动事件iOS

objective-c - Cocos2d - 使用TexturePacker创建的.pvr.ccz spritesheet(位置不正确,模糊)的问题