私はウェブアプリで作業しています。私は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 フィールドと同様に機能します。それで、私は何を間違っていますか?