如何设置 NSBatchDeleteRequest 的 NSBatchDeleteResult 类型?

Posted

技术标签:

【中文标题】如何设置 NSBatchDeleteRequest 的 NSBatchDeleteResult 类型?【英文标题】:How to set the type of NSBatchDeleteResult of a NSBatchDeleteRequest? 【发布时间】:2017-07-16 11:11:52 【问题描述】:

我有一些执行批量删除请求的核心:

extension NSManagedObject: Clearable 
    /// Clears all objects of this type in coreData
    static func clearAll() 
        let context = AppDelegate.sharedInstance()?.coreDataHelper.objectContext()
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: String(describing:self))
        let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
        do 
            if let unwrappedContext = context 
                unwrappedContext.shouldDeleteInaccessibleFaults = true
                let result = try unwrappedContext.execute(batchDeleteRequest) as? NSBatchDeleteResult
                DLog("result \(result.debugDescription)")
                switch result!.resultType 
                case .resultTypeCount:
                    DLog("resultTypeCount")
                case .resultTypeObjectIDs:
                    DLog("resultTypeObjectIDs")
                case .resultTypeStatusOnly:
                    DLog("resultTypeStatusOnly")
                
                if let objectIDArray = result?.result as? [NSManagedObjectID] 
                    let changes = [NSDeletedObjectsKey : objectIDArray]
                    NSManagedObjectContext.mergeChanges(fromRemoteContextSave: changes, into: [unwrappedContext])
                
                try context?.save()
            
         catch let error as NSError 
            DLog("Error removing : \(error), \(error.localizedDescription)")
        
    

代码运行正常,但是批量删除的结果总是.resultTypeStatusOnly

https://developer.apple.com/library/content/featuredarticles/CoreData_Batch_Guide/BatchDeletes/BatchDeletes.html#//apple_ref/doc/uid/TP40016086-CH3-SW2 此处的文档在标题下说 在执行后更新您的应用程序

通知应用程序中的对象很重要 内存已过时,需要刷新。

为此,结果类型必须为.resultTypeObjectIDs,才能触发NSManagedObjectContext.mergeChanges(fromRemoteContextSave: changes, into: [unwrappedContext]) 部分。只是不清楚你是如何得到的。

如何设置结果的类型?

【问题讨论】:

【参考方案1】:

您可以在batchDeleteRequest 上设置resultType 属性。所以,同样来自https://developer.apple.com/library/content/featuredarticles/CoreData_Batch_Guide/BatchDeletes/BatchDeletes.html:

executeRequest 成功完成后,会收到响应。该响应可以采取两种形式之一。通过在 NSBatchDeleteRequest 上设置 resultType 属性来确定响应的形式。默认值为 NSStatusOnlyResultType,它不返回任何内容。 另一个选项是 NSBatchDeleteObjectIDsResultType,它返回一个 NSManagedObjectID 实例数组,指示在执行期间删除了哪些实体。

希望这会有所帮助。祝你好运!

【讨论】:

正确的语法是:batchDeleteRequest.resultType = .resultTypeObjectIDs

以上是关于如何设置 NSBatchDeleteRequest 的 NSBatchDeleteResult 类型?的主要内容,如果未能解决你的问题,请参考以下文章

NSBatchDeleteRequest 留下不好的关系

使用带有 NSBatchDeleteRequest 的 NSFetchedResultsController

UI 在执行 NSBatchDeleteRequest 时冻结

在 NSBatchDeleteRequest 之后使用核心数据

核心数据 NSBatchDeleteRequest 似乎将对象留在上下文中

android如何设置网络优先