用户注销时从队列中处理块执行(将图像保存在核心数据中的块)

Posted

技术标签:

【中文标题】用户注销时从队列中处理块执行(将图像保存在核心数据中的块)【英文标题】:Handling of block execution (block which saves image in core data) from queue when user logsout 【发布时间】:2013-05-05 03:36:14 【问题描述】:

这就是我在项目中所做的事情 用户确实使用 facebook 登录,一旦成功登录,应用程序就会开始从后台队列中的服务器下载所有图像。我已经将图像的保存写入一个块中的核心数据并将该块提交到后台队列,这样主线程就不会被阻塞。

问题: 用户登录后,他会转到设置屏幕,然后退出应用程序。此时队列中可能有块,它们将执行将图像保存到核心数据。我的应用程序由于未捕获的异常而崩溃* 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“无法从此 NSManagedObjectContext 的协调器访问对象的持久存储。

当我注销时,我会清除应用程序的持久性存储和协调器。这些是应用程序的全局对象。但我不确定为什么会发生这种崩溃?

谢谢

【问题讨论】:

您是否同时取消所有挂起的加载? 既然blocks被提交到queue来获取图片并保存到core data中,那么这些blocks如何被取消或者停止执行呢? 您应该使用操作队列和/或让块检查它们是否应该继续操作(例如检查当前用户和登录状态)。 正如@Wain 所说,使用原子属性,您的块可以首先检查单个 ivar 标志 (isCancelled) 或用户状态以了解是否工作。 【参考方案1】:

此问题已修复。问题是由于用户点击注销时清除了应用程序的商店。当它被清除时,队列中可能有一些仍在执行的块,当它们尝试将图像保存到核心数据时,应用程序会崩溃。现在我已经修复了这个购买,将清除存储添加为块的一部分并提交到同一个队列,这样一旦所有块都从队列中结束,存储就会被清除。

【讨论】:

以上是关于用户注销时从队列中处理块执行(将图像保存在核心数据中的块)的主要内容,如果未能解决你的问题,请参考以下文章

滚动时从“cellForRowAtIndexPath”保存到 CoreData 崩溃

激活滑动删除时从一行中删除核心数据

如何在图像按钮单击时从Gridview获取ID。

在用户注销时从我的应用程序中删除 facebook 会话 cookie

处理注销的更好方法

更改密码时从所有浏览器中注销用户