iOS:如果我执行后台作业然后离开视图控制器会发生什么?

时间:2012-02-15 21:57:45

标签: iphone objective-c ios grand-central-dispatch nsoperation

假设我有视图控制器A和视图控制器B.

在VC A中,我推送VC B.然后在VC B中,我使用NSOperation执行一些后台任务。在后台任务中,我修改了VC B的变量。

如果后台任务没有完成并退出VC B会怎样?操作会被取消还是仍然会执行?调试时,似乎它们仍在执行。在这种情况下,他们不会访问已经发布的变量(因为我退出了VC B)。

我有点困惑,任何人都可以把我搞清楚? :)

谢谢,

3 个答案:

答案 0 :(得分:4)

你是对的,操作不会因为产生它的对象而神奇地消失。

当您尝试访问现已解除分配的视图控制器对象时,将导致操作系统抛出异常。这是进行后台线程操作的危险。

在这种情况下,您需要进行相应的计划,以便在VC B被取消分配时取消您的操作。这意味着继承NSOperation,实现main()并检查isCancelled。

请参阅Apple有关NSOperation,NSOperationQueues和并发编程的文档。

答案 1 :(得分:4)

考虑VC-B的目的与背景活动的目的相比,这将是一件好事。如果后台活动支持用户在VC-B上看到的内容,并且当用户离开VC-B时,后台活动不再相关,那么离开VC-B应该导致后台活动停止。另一方面,如果后台活动的目的是“大于”VC-B,则用户会期望它们继续;在这种情况下,可能适合某些“相对永久/长期”的对象(“后台经理”)来管理活动。在后一种情况下,VC将适当地与后台管理器交互。

所以(应该如此)它归结为你(更重要的是,用户)想要/期望的内容......

答案 2 :(得分:1)

来自文档:

  

将操作添加到队列后,操作无法完成。队列接管并处理该任务的调度。

理想情况下,如果可以在操作运行时取消分配VC变量,则不应直接修改VC变量,但应计算结果然后进行回调。如果您使用ARC,您可以对视图控制器保持弱引用,即使您的VC被取消分配也可以安全引用。

如果您希望实现并发性,可能需要考虑使用Grand Central Dispatch和阻止。这可以更好地工作,因为块封装并保留您在块内引用的任何变量,更容易设置和执行并使代码更清晰。