假设我有视图控制器A和视图控制器B.
在VC A中,我推送VC B.然后在VC B中,我使用NSOperation执行一些后台任务。在后台任务中,我修改了VC B的变量。
如果后台任务没有完成并退出VC B会怎样?操作会被取消还是仍然会执行?调试时,似乎它们仍在执行。在这种情况下,他们不会访问已经发布的变量(因为我退出了VC B)。
我有点困惑,任何人都可以把我搞清楚? :)
谢谢,
答案 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和阻止。这可以更好地工作,因为块封装并保留您在块内引用的任何变量,更容易设置和执行并使代码更清晰。