我正在使用网络应用程序。我有处理 NSFetchedResultsController 的 UITableViewController。我通过CoreData 存储tableView 的对象。当用户刷新 UI 时,我执行服务器请求,然后为每个新实体调用批量更新,我的 CoreData 类如下所示:
extension DBOrder {
@NSManaged var comment: String
@NSManaged var date: NSNumber
@NSManaged var id: NSNumber
@NSManaged var maturity_date: NSNumber
@NSManaged var number_of_tasks: NSNumber
@NSManaged var price: NSNumber
@NSManaged var status: String
@NSManaged var subject: String
@NSManaged var taskImages: [String]
@NSManaged var theme: String
}
“id”对于每个对象都是唯一的。“propertiesToUpdate”由一些字段组成,如“maturity_date”:1470427641000,“status”:“some status”等。“entityName”是“DBOrder”。而 privateContext 是 NSManagedObjectContext 类型,用于在后台更新实体
func updateCoreData(id: NSNumber, entityName: String, propertiesToUpdate: [String: AnyObject], privateContext: NSManagedObjectContext) -> Bool {
let batchRequest = NSBatchUpdateRequest(entityName: entityName)
batchRequest.predicate = NSPredicate(format: "id == %@", id)
if !doesOrderExists(entityName, id: id, context: privateContext) {
return false
}
batchRequest.propertiesToUpdate = propertiesToUpdate
batchRequest.resultType = .UpdatedObjectIDsResultType
do {
let res = try privateContext.executeRequest(batchRequest) as! NSBatchUpdateResult
let orderIDs = res.result as! [NSManagedObjectID]
return (orderIDs.count != 0) ? true : false
} catch {
print(error)
}
return false
}
为从服务器加载的每个对象调用此函数。如果对象已经存在,那么我更新它,否则创建新的。
最后,问题是:当我使用批量更新时,它与 NSNumber 一起工作不正确。它总是将 NSNumber 字段设置为 nil 并按其应有的 String 字段工作。那么,我做错了什么?