CoreData
オブジェクトをバックグラウンドでAPIサーバーにアップロードする必要があります。これを行うには、メインコンテキストの子として新しいプライベートコンテキストを作成し、perform()
を実行します。このコンテキストを使用して、オブジェクトからJSONデータを取得し、アップロード後にオブジェクトにデータを書き込むことができます。Swift:バックグラウンドでCoreDataオブジェクトを同期する
すべてうまくいくようですが、疑問があります。
以下は、このケースを示す簡単な例です。コンテキストは、第2の関数でいくつかの強力な参照を持っていますか?私はどこかで私の新しい文脈を強く参照するべきですか?
// ViewController.swift
func uploadObject(_ currentObject: MyManagedObject) {
// we are in the main thread, go to another thread
let objectId = currentObject.objectID
let context = getNewPrivateContext() // child context of the main context
context.perform {
if let object = context.object(with: objectId) as? MyManagedObject {
SyncManager.shared.uploadObject(_ object: object, completion: {
// ... update UI
})
}
}
}
// SyncManager.swift
func uploadObject(_ object: MyManagedObject, completion:()->()) {
// does the context has some strong reference here?
guard let context = object.managedObjectContext { completion(); return }
let params = getJson(with: object)
// ... prepare url, headers
Alamofire.request(url, method: .put, parameters: params, encoding: JSONEncoding.default, headers: headers)
.responseJSON(completionHandler: { (response) in
// ... parse the response
context.perform {
// ... write some data to the Core Data and save the context
completion()
}
})
}
また、私の疑問は、1つのlldb問題によってサポートされているEDIT
:それは強い参照ですが、それは安全ではない、受信機(オブジェクト)が削除された場合を意味
(lldb) po context
error: <EXPR>:3:1: error: use of unresolved identifier 'context'
context
^~~~~~~
すべてがcontext.object(OBJECTIDと)'があることに注意してください – Ladislav
私にはよさそうです君は。あなたはおそらく 'existingObject(with:)' – jrturton