2016-10-27 6 views
0

私はメソッドUser.updateMyObject(id: NSNumber, name: String)を呼び出すNSUrlRequestを持っています。コアデータ:NSUrlRequest内で更新する正しい方法

static let appDelegate = UIApplication.shared.delegate as! AppDelegate 
static let MOC = appDelegate.managedObjectContext 

そしてオブジェクトを削除/作成/更新するためのいくつかのメソッド:オブジェクトUserは静的な特性を有しています。

ここでは、MOCを別のスレッドで使用しないでください。そして、NSUrlRequestが非同期に実行されることを知る限り、どうすればMyObject.updateMyObject(id: NSNumber, name: String)に電話をかけることができますか?

私は時々エラーを取得:なぜperformperformAndWait方法

static func updateMyObject(id: NSNumber, name: String) { 
    let request: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "MyObject") 
    let resultPredicate = NSPredicate(format: "id = \(id)") 
    request.predicate = resultPredicate 

    do { 
     let result = try User.MOC.fetch(request).first as! MyObject 

     result.name = name 

     User.appDelegate.saveContext() 
    } 
    catch { 
     print("User.updateMyObject: error.") 
    } 
} 

答えて

1

これは、次のとおりです。

let session = URLSession.shared 
    // The singleton shared session is for basic requests. 
    // Data tasks send and receive data using NSData objects. 
    // Data tasks are intended for short, often interactive requests to a server. 
    let task = session.dataTask(with: request) { 
     (data: Data?, response: URLResponse?, error: Error?) in 

    //JSon parsing 
    MyObject.updateMyObject(id: NSNumber, name: String) 
} 
task.resume() 

MyObject.updateMyObject(id: NSNumber, name: String)は次のようになります。

CoreData: error: Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. -[__NSCFSet addObject:]: attempt to insert nil with userInfo (null) 
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFSet addObject:]: attempt to insert nil' 

は私のリクエストはこのようになります存在します。NSManagedObjectContext - 異なるスレッド上でコンテキストを安全に使用できるようにします。ここでそれらの1つを使用する必要があります。

一般に、関連するコアデータに触れるたびに、これらの2つの方法のいずれかの呼び出しでそのコードをラップする必要があります。メソッドは引数としてクロージャをとる。あなたのコアデータコードをそのクロージャーに入れてください。この規則の唯一の例外は、mainQueueConcurrencyTypeを使用している場合、コードがメインキューで実行されていることがわかります。

+0

こんにちはTomは答えをありがとう、非常に感謝しています。例を付けることができますか?私は、JSONの中にリクエストをパースするか、別の場所に追加するべきかどうか分かりません。 – Frederik

+1

@FrederikNorlykEriksen詳細を追加 –

関連する問題