2017-10-17 1 views
0

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 
^~~~~~~ 
+0

すべてがcontext.object(OBJECTIDと)'があることに注意してください – Ladislav

+0

私にはよさそうです君は。あなたはおそらく 'existingObject(with:)' – jrturton

答えて

0

コンテキストから、それはnilを返します。

はちょうど私の意見では、私の代わりに、ガードのif letステートメントを使用します。 `のための新しいオブジェクトを生成します。

func uploadObject(_ object: MyManagedObject, completion:()->()) { 
    // does the context has some strong reference here? 
    if let context = object.managedObjectContext { 

     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() 
      } 
     }) 
    } else { 
     completion() 
    } 
} 
+0

object.managedObjectContext()は単に誤字に過ぎません。一定。 –

+0

'guard 'を' let'に変更することは意味をなさない。これは、コードの不要なネストを追加するだけです。 –

+0

それについては申し訳ありません:)、それは私が見た唯一の問題でした...あなたはprivateMOCを保存しています。親MOCへの変更をプッシュします...私はそれがより良いことを意味しませんでした。オプションを処理する。 'context'が設定されている場合にのみ、コードブロックが実行されます。 –

関連する問題