【问题标题】:How to inform my NSFetchedResultsController that I changed some objects via NSBatchUpdateRequest?如何通知我的 NSFetchedResultsController 我通过 NSBatchUpdateRequest 更改了一些对象?
【发布时间】:2015-10-19 12:18:10
【问题描述】:

我创建了简单的NSBatchUpdateRequest

let bur = NSBatchUpdateRequest(entityName: "WLWishlist")
bur.predicate = NSPredicate(format: "name = %@", "oldname")
bur.propertiesToUpdate = ["name": "newname"]
bur.resultType = .UpdatedObjectsCountResultType

然后执行它们:

do {        
    let result = try NSManagedObjectContext.MR_defaultContext().executeRequest(bur) as? NSBatchUpdateResult
    print("------------- \(result!.result)")
} catch {
    print("error")
}

控制台的输出是:

------------- 可选(6)

但我的NSFetchedResultsController 管理相同的对象,不知道某事被改变了。如何通知NSFetchedResultsController

【问题讨论】:

  • 我也有同样的问题。你有没有想出一个解决方案?我知道它现在已经很老了......

标签: swift ios9 nsfetchedresultscontroller nsbatchupdaterequest


【解决方案1】:

首先您必须将resultType 更改为.UpdatedObjectIDsResultType

    bur.resultType = .UpdatedObjectIDsResultType

执行请求后,您必须遍历 NSManagedObjectIDs 并在 NSManagedObejctContext 中刷新它们。在此之后,您必须再次 performFetch() NSFetchedResultsController

    do {

        let result = try context.executeRequest(bur) as? NSBatchUpdateResult
        if let ids = result?.result as? [NSManagedObjectID] {

            for id in ids {
                let object = context.objectWithID(id)
                context.refreshObject(object, mergeChanges: true)
            }
            try fetchedResultsController.performFetch()
        }

    } catch {
        print("error")
    }

【讨论】:

  • 等等,如果你执行一个 fetch 并清除 fetch 控制器缓存,并且你在与 fetch 控制器相同的上下文中执行批处理请求,为什么你需要合并对象并强制它们出错并执行另一个提取?我目前的经验表明,如果您执行提取,则会反映正确的结果。这忽略了一个事实,即我对每个人如何建议在批处理请求上强制出错感到有点困惑。如果您要更新 1000 条记录,我怀疑您是否想要迭代和故障 1000 个对象的性能。
猜你喜欢
  • 1970-01-01
  • 2015-04-24
  • 2013-05-01
  • 2018-04-21
  • 1970-01-01
  • 2012-05-14
  • 2015-09-20
  • 1970-01-01
  • 2020-08-18
相关资源
最近更新 更多