[英]fetching from CloudKit and saving to CoreData
this is going to be a really noob question but I'm trying to get my app to download data from CloudKit and then save it to CoreData. 这将是一个真正的菜鸟问题,但是我试图让我的应用程序从CloudKit下载数据,然后将其保存到CoreData。
When I run this type of code, I get the following error. 当我运行这种类型的代码时,出现以下错误。 I'm really noob at CoreData, so this has been hard for me to understand. 我真的是CoreData的菜鸟,所以这让我很难理解。 I think it has something to do with the way I'm dispatching the requests, but I'm not sure how I'm supposed to fix it. 我认为这与我调度请求的方式有关,但是我不确定应该如何解决。 The error I get is: 我得到的错误是:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'recordChangeSnapshot:forObjectID:: global ID may not be temporary when recording ' 由于未捕获的异常“ NSInternalInconsistencyException”而终止应用程序,原因:“ recordChangeSnapshot:forObjectID ::全局ID在记录时可能不是临时的”
Anyone have any ideas? 有人有想法么?
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)
}
}
}
You can use isMainThread
to determine if you're on a background thread.. or you can directly write the code like this, which will always ensure it's in main thread:- 您可以使用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)")
}
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.