2016-10-27 3 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)에 전화할까요?

나는 가끔 오류가

:

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' 

내 요청은 다음과 같습니다

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)

은 다음과 같습니다

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

이 왜 performperformAndWait 방법입니다 존재하는 : NSManagedObjectContext - 다른 스레드에서 컨텍스트를 안전하게 사용할 수 있습니다. 여기에서 그 중 하나를 사용해야합니다.

일반적으로 관련된 핵심 데이터를 터치 할 때마다이 두 가지 방법 중 하나를 호출하여 해당 코드를 래핑해야합니다. 이 메소드는 클로저를 인수로 사용합니다. 그 클로저에 핵심 데이터 코드를 넣으십시오. 이 규칙에 대한 유일한 예외는 mainQueueConcurrencyType을 사용하면 코드가 기본 대기열에서 실행되고 있음을 알 수 있습니다.

+0

답변을 주셔서 감사합니다. 많은 감사드립니다. 예를 들어 주시겠습니까? 요청의 일부를 파싱하는 JSON 내부에 추가해야하는지 잘 모르겠습니까? – Frederik

+1

@FrederikNorlykEriksen 세부 사항 추가 –

관련 문제