首先,我意识到我可能是由于错误地解决了之前的问题而导致了这个问题......
在 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/