2016-07-28 6 views
0

Я написал код, готовый асинхронный ввод данных из CoreData. Я следил за советами в Интернете, но иногда я получаю следующую ошибку: CoreData: ошибка: NULL _cd_rawData, но объект не превращается в неисправностьОшибка Swift, GCD и CoreData: ошибка: NULL _cd_rawData, но объект не превращается в ошибку

Вот мой код, который выполняет чтение объект из основных данных и который выдает ошибку.

func getObject(forKey: String, answer: (Bool, NSObject?) ->()) { 
    let pMOC = initPrivateMOC() 
    pMOC.performBlock({ 
     let fetchRequest = NSFetchRequest() 

     let entityDescription = NSEntityDescription.entityForName("CacheObject", inManagedObjectContext: pMOC) 

     fetchRequest.entity = entityDescription 
     fetchRequest.predicate = NSPredicate(format: "identifier == %@", forKey) 


     do { 
      let result = try self.managedObjectContext?.executeFetchRequest(fetchRequest) as! [CacheObject] 
      var answerObject:NSObject? 
      if !result.isEmpty { 
       if let coObject = result[0].object { 
        if let retrievedObject = NSKeyedUnarchiver.unarchiveObjectWithData(coObject) as? NSObject { 
         answerObject = retrievedObject 
        } 
       } 
      } 
      answer(true, answerObject) 
     } catch { 
      answer(false, nil) 
      fatalError("[CacheManager:getObject] -> Fehler beim Lesen von Daten") 
     } 
    }) 
} 

При if let coObject = result[0].object ошибка распространяется. Вот функция получения частного MOC:

init() { 
    let coreDataHandler = CoreDataHandler(identifier: "MK.SimpleCacheStore", ressource: "SimpleCache") 
    self.managedObjectContext = coreDataHandler.getMOC() 

} 

func initPrivateMOC() -> NSManagedObjectContext { 
    let pMOC = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType) 
    pMOC.parentContext = self.managedObjectContext 

    return pMOC 
} 

А также вызов из класса, над которым получает доступ на запросы:

public func get(forKey: String, answer: (Bool, NSObject?) ->()) { 
    if let cam = cacheManager { 
     if let cachedObj = cam.getObjectFromCache(forKey) { 
      print("[SCManager:get] -> Objekt aus NSCache geladen") 
      answer(true, cachedObj) 
     } else { 
      if let cdm = coreDataManger { 
       dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), { 
        cdm.getObject(forKey, answer: { 
         success, data in 
         //Enable Entry in NSCache 
         if let cdData = data { 
          cam.saveObjectToCache(forKey, object: cdData) 
          print("[SCManager:get] -> Objekt nach nicht auffinden gecacht") 
         } 
         print("[SCManager:get] -> Objekt nicht in NSCache, deshalb aus CoreData") 
         answer(success, data) 
        }) 
       }) 
      } 
     } 
} 

Вы знаете проблему или найти любую ошибку или проблему в том, как я реализовал GCD и CoreData, подсказка была бы очень полезной.

ответ

0

Я нашел проблему, я не добавляю приватную MOC в свои запросы. Таким образом, решение должно использовать pMOC для fetchRequest()