0

我正在使用网络应用程序。我有处理 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 字段工作。那么,我做错了什么?

4

0 回答 0