【发布时间】:2015-05-06 02:02:57
【问题描述】:
我创建了一个将 Core Data 与 iCloud 结合使用的应用程序。似乎我所有困难的部分都能正常工作,但缺少一些非常重要的东西。一旦安装在两台物理设备上,其中一台的更改会按预期显示在第二台上。问题是我必须安装应用程序,然后在任何数据出现在主表视图中之前关闭它并重新启动它。 Xcode 6.3.1 iOS 8.3
每个设备都是如此。从两台设备上删除应用程序后,我将应用程序安装在一台设备上。我在控制台上收到了这个:
2015-05-04 15:33:05.297 BiopLogCloud[1353:734999] -PFUbiquitySwitchboardEntryMetadata setUseLocalStorage::CoreData:Ubiquity: 手机~C1432E0B-D885-418C-996C-5E6CDD45D7F1:BiopLogCloudStore 使用 local storage: 1 里面的persistentStoreDidChange里面的count是0 里面的persistentStoreDidChange里面的persistentStoreDidChange里面 里面的persistentStoreDidChange里面的persistentStoreDidChange里面 里面的persistentStoreDidChange里面的persistentStoreDidChange里面 persistentStoreDidChange 内的 persistentStoreWillChange 2015-05-04 15:33:06.979 BiopLogCloud [1353:735018] -PFUbiquitySwitchboardEntryMetadata setUseLocalStorage::CoreData:Ubiquity: 手机~C1432E0B-D885-418C-996C-5E6CDD45D7F1:BiopLogCloudStore 使用 本地存储:0
注意计数变量 - 为零。然后我重新启动应用程序和 数据存在。我是否从 Xcode 构建和运行都没有关系 或者只是从设备启动应用程序。数据即刻出现 如果从 Xcode 启动,我会在控制台中收到以下信息:
2015-05-04 15:35:03.542 BiopLogCloud[1358:735588] -PFUbiquitySwitchboardEntryMetadata setUseLocalStorage::CoreData:Ubiquity: 手机~C1432E0B-D885-418C-996C-5E6CDD45D7F1:BiopLogCloudStore 使用 本地存储:1persistentStoreDidChange 内的计数为 12 2015-05-04 15:35:04.062 BiopLogCloud [1358:735625] -PFUbiquitySwitchboardEntryMetadata setUseLocalStorage::CoreData:Ubiquity: 手机~C1432E0B-D885-418C-996C-5E6CDD45D7F1:BiopLogCloudStore 使用 本地存储:0
在第二台设备上重复相同的过程后,应用按预期运行。
由于它在这个初始问题之后工作,我不确定要显示什么代码,但这里是相关的持久性存储和获取的结果代码:
lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = {
var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
let documentsDirectory = NSFileManager.defaultManager().URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask).last as! NSURL
let storeURL = documentsDirectory.URLByAppendingPathComponent("BiopLogCloud.sqlite")
//if the store is incompatible
//NSFileManager.defaultManager().removeItemAtURL(url, error: nil)
//nuke it
var error: NSError? = nil
var failureReason = "There was an error creating or loading the application's saved data."
let storeOptions = [NSPersistentStoreUbiquitousContentNameKey : "BiopLogCloudStore"]
if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: storeOptions, error: &error) == nil {
coordinator = nil
// Report any error we got.
let dict = NSMutableDictionary()
dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data - cloud persistent store not created"
dict[NSLocalizedFailureReasonErrorKey] = failureReason
dict[NSUnderlyingErrorKey] = error
error = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict as [NSObject : AnyObject])
// Remember to create an alert for the user in case of error
NSLog("Unresolved error \(error), \(error!.userInfo)")
abort()
}
return coordinator
}()
lazy var managedObjectContext: NSManagedObjectContext? = {
let coordinator = self.persistentStoreCoordinator
if coordinator == nil {
println("YES! You have found the issue - coordinator is nil")
return nil
}
var managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = coordinator
return managedObjectContext
}()
var fetchedResultsController: NSFetchedResultsController {
if myFetchedResultsController != nil {
return myFetchedResultsController!
}
let fetchRequest = NSFetchRequest()
// Edit the entity name as appropriate auto generate didn't work - fix that
let entity = NSEntityDescription.entityForName("Patient", inManagedObjectContext: managedObjectContext)
fetchRequest.entity = entity
// Set the batch size to a suitable number.
fetchRequest.fetchBatchSize = 50
// Edit the sort keys as appropriate.
let sortDescriptor = NSSortDescriptor(key: "dateEntered", ascending: false)
let sortDescriptors = [sortDescriptor]
fetchRequest.sortDescriptors = [sortDescriptor]
let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managedObjectContext, sectionNameKeyPath: nil, cacheName: "PatientCache")
var countError : NSError? = nil
var count = managedObjectContext.countForFetchRequest(fetchRequest, error: &countError)
println("The count is \(count)")
aFetchedResultsController.delegate = self
myFetchedResultsController = aFetchedResultsController
var error: NSError? = nil
if !myFetchedResultsController!.performFetch(&error) {
// Replace this implementation with code to handle the error appropriately.
println("Unresolved error \(error), \(error!.userInfo)")
abort()
}
return myFetchedResultsController!
}
var myFetchedResultsController: NSFetchedResultsController? = nil
【问题讨论】: