2016-01-28 1 views
0

это будет действительно вопрос о нобе, но я пытаюсь получить свое приложение для загрузки данных из CloudKit, а затем сохранить его в CoreData.извлечение из CloudKit и сохранение в CoreData

Когда я запускаю этот тип кода, я получаю следующую ошибку. Я действительно нуб в CoreData, поэтому мне было трудно понять. Я думаю, что это имеет какое-то отношение к тому, как я отправляю запросы, но я не уверен, как я должен это исправить. Ошибки я получаю:

Нагрузочное приложение из-за неперехваченное исключение «NSInternalInconsistencyException», причина: «recordChangeSnapshot: forObjectID :: глобального ID не может быть временным при записи »

Кто-нибудь есть какие-либо идеи ?

import UIKit 
import CloudKit 
import CoreData 

class Start: UIViewController { 

    var classroomEN: String? 
    var classroomTC: String? 
    var classroomSC: String? 

    var videos = [NSManagedObject]() 

    override func viewDidLoad() { 

     fetchData() 
     fetchDataTC() 
    } 

    func fetchData() { 

     //added to fetch data from CloudKit 
     let container = CKContainer.defaultContainer() 
     let publicData = container.publicCloudDatabase 

     let predicate = NSPredicate(value: true) 

     let queryEN = CKQuery(recordType: "ClassroomFAQEN", predicate: predicate) 
     let queryTC = CKQuery(recordType: "ClassroomFAQTC", predicate: predicate) 

     queryEN.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] 
     queryTC.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] 

     publicData.performQuery(queryEN, inZoneWithID: nil) { results, error in 

      if error == nil { // There is no error 

       for entry in results! { 
        let newFAQ = classFAQ() 
        newFAQ.title = entry["Title"] as! String 
        newFAQ.content = entry["Content"] as! String 
        if entry["Picture"] != nil { 
         print("There is no picture") 
         newFAQ.picture = entry["Picture"] as! String 
        } 
        if entry["Video"] != nil { 
         print("There is no video") 
         newFAQ.video = entry["Video"] as! String 
        } 

        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
        let managedContext = appDelegate.managedObjectContext 
        let entity = NSEntityDescription.entityForName("ClassroomFAQEN", inManagedObjectContext:managedContext) 
        let video = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: managedContext) 
        video.setValue(newFAQ.title, forKey: "title") 
        video.setValue(newFAQ.content, forKey: "content") 
        video.setValue(newFAQ.picture, forKey: "picture") 
        video.setValue(newFAQ.video, forKey: "video") 

        do { 
         try video.managedObjectContext!.save() 
         self.videos.append(video) 
        } catch let error as NSError { 
         print("Could not save \(error), \(error.userInfo)") 
        } 

        dispatch_async(dispatch_get_main_queue(), {() -> Void in 
         print("Reloading data in tableView") 
         self.fetchDataTC() 
        }) 
       } 
      } 
      else { 
       print(error) 
      } 
     } 
    } 

    func fetchDataTC() { 

     //added to fetch data from CloudKit 
     let container = CKContainer.defaultContainer() 
     let publicData = container.publicCloudDatabase 

     let predicate = NSPredicate(value: true) 

     let queryEN = CKQuery(recordType: "ClassroomFAQEN", predicate: predicate) 
     let queryTC = CKQuery(recordType: "ClassroomFAQTC", predicate: predicate) 

     queryEN.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] 
     queryTC.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] 

     publicData.performQuery(queryTC, inZoneWithID: nil) { results, error in 

      if error == nil { // There is no error 

       for entry in results! { 
        let newFAQ = classFAQ() 
        newFAQ.title = entry["Title"] as! String 
        newFAQ.content = entry["Content"] as! String 
        if entry["Picture"] != nil { 
         print("There is no picture") 
         newFAQ.picture = entry["Picture"] as! String 
        } 
        if entry["Video"] != nil { 
         print("There is no video") 
         newFAQ.video = entry["Video"] as! String 
        } 

        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
        let managedContext = appDelegate.managedObjectContext 
        let entity = NSEntityDescription.entityForName("ClassroomFAQTC", inManagedObjectContext:managedContext) 
        let video = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: managedContext) 
        video.setValue(newFAQ.title, forKey: "title") 
        video.setValue(newFAQ.content, forKey: "content") 
        video.setValue(newFAQ.picture, forKey: "picture") 
        video.setValue(newFAQ.video, forKey: "video") 

        do { 
         try video.managedObjectContext!.save() 
         self.videos.append(video) 
        } catch let error as NSError { 
         print("Could not save \(error), \(error.userInfo)") 
        } 

        dispatch_async(dispatch_get_main_queue(), {() -> Void in 
         print("Reloading data in tableView") 
        }) 
       } 
      } 
      else { 
       print(error) 
      } 
     } 

    } 
+0

является этот вызов для "video.managedObjectContext! .save()" происходит в фоновом потоке? его обычно называют основной нитью. – Vizllx

+0

Спасибо за сообщение. Извините, как я могу сохранить в основной поток? – user3136022

ответ

0

Вы можете использовать isMainThread, чтобы определить, если вы на фоне потока .. или вы можете напрямую писать код, как это, который всегда будет гарантировать, что это в основном потоке: -

dispatch_async(dispatch_get_main_queue(), {() -> Void in 
         do { 
         try video.managedObjectContext!.save() 
         self.videos.append(video) 
        } catch let error as NSError { 
         print("Could not save \(error), \(error.userInfo)") 
        } 
        }) 
+0

Я получаю сообщение об ошибке с вашим кодом. Любой совет? Унарный оператор! не может быть применен к операнду типа() -> Bool – user3136022

+0

проверить мой обновленный ответ – Vizllx

+0

Привет, Vizllx, похоже, что он работает. Однако у меня проблема. Всякий раз, когда я запускаю приложение, он не собирает все записи в моей CloudKit DB. Например, в классе ClassroomFAQEN есть 9 записей. Я получаю только 1-3 из них. Любая идея, почему это происходит? – user3136022