如果一个UIViewController运行如下所示的后台线程操作并且在竞争之前被释放(假设它是从UINavigationController弹出),后台线程是否会停止?确保后台线程完成的好方法是什么? 我担心的是,如果用户输入一个值到字段并且在取消分配视图控制器之前未更新数据库,则不会更新数据库。
// Doing something on the main thread
dispatch_queue_t myQueue = dispatch_queue_create("My Queue",NULL);
dispatch_async(myQueue, ^{
// Perform long running process
dispatch_async(dispatch_get_main_queue(), ^{
// Update the UI
});
});
// Continue doing other stuff on the
// main thread while process is running.
答案 0 :(得分:1)
不,后台线程不会停止。
这是因为GCD将保留块直到块完成。一旦发出阻止,您的视图控制器就会变得无关紧要。
此外,如果您有任何变量的引用,无论是视图控制器本身还是本地定义了块的方法范围,那么这些变量也将被保留。
因此,即使视图控制器不再位于导航堆栈中,也有可能不会取消分配视图。