处理不再存在的核心数据获取对象

时间:2014-01-31 17:03:56

标签: ios objective-c core-data

背景信息:

我有一个访问用户电子邮件帐户并提取帐户数据的应用程序:电子邮件,文件夹等。此过程包括几个步骤,最后一步是将新获取的信息保存或更新到核心数据。从开始到结束的整个过程可能需要几秒钟。

以下是问题:

  1. 用户打开应用程序,开始提取新的或更新的帐户数据流程。
  2. 用户决定删除正在进行抓取的当前帐户。
  3. 发送一个呼叫以取消当前帐户的任何打开提取请求,但是,提取请求已完成,核心数据现在正在尝试保存新数据。
  4. 在尝试访问“现有”核心数据对象以更新它们时,会删除对象并发生崩溃。
  5. 具体来说,我得到的错误如下:

    CoreData: annotation: logically false fetch request <NSFetchRequest: 0x13ce1430> (entity:     Thread; predicate: (threadId == 1457719230395529203 AND folder == <Folder: 0xc1994c0> (entity: Folder; id: 0xc2ccb20 <x-coredata://A0837E88-30EB-46E8-A9BC-D6699EC7F160/Folder/p10> ; data: <fault>)); sortDescriptors: ((null)); type: NSManagedObjectResultType; ) short circuits.
    

    崩溃发生在核心数据试图获取不再存在的对象的行上。

    对核心数据不熟悉,我想知道是否有处理这种情况的一般策略。

1 个答案:

答案 0 :(得分:0)

您可以在数据模型上分离这种逻辑工作,以便在使用队列上的操作启动下一个主要操作之前完成每个主要操作。

在这种特定情况下,听起来似乎没有正确处理当前请求的取消。取消活动后,您应该能够停止待处理的操作。您可能需要添加一个标志,并在每次异步回调之后和保存修改之前检查活动是否被取消。