核心数据iCloud直到第二次启动之前才填充表图



我创建了一个使用iCloud的核心数据的应用程序。看来我所有的困难作品都正确地工作了,但是缺少一些非常重要的东西。一旦安装在两个物理设备上,第二个更改如预期的。问题是我必须安装该应用程序,然后将其关闭并重新启动,然后再出现在主表视图中的任何数据之前。Xcode 6.3.1 ios 8.3

对于每个设备都是如此。从两个设备中删除该应用程序后,我将应用程序安装在一台设备上。我在控制台上收到此内容:

2015-05-04 15:33:05.297 Bioplogcloud [1353:734999] -pfubiquicityswitchboardenrymetadata setuselocalstorage :: coredata:Ubiquity: 手机〜C1432E0B-D885-418C-996C-5E6CDD45D7F1:使用BioplogCloudStore使用 本地存储:1计数为0,内部persistentStoredIdChange persistentStoredIdChange内部persistentStoredIdChange persistentStoredIdChange内部persistentStoredIdChange persistentStoredIdChange内部persistentStoredIdChange PersistentStoreWillChange内部persistentStoredIdChange 2015-05-04 15:33:06.979 Bioplogcloud [1353:735018] -pfubiquicityswitchboardenrymetadata setuselocalstorage :: coredata:Ubiquity: 手机〜C1432E0B-D885-418C-996C-5E6CDD45D7F1:使用BioplogCloudStore使用 本地存储:0

注意计数变量 - 零。然后我重新推出应用程序和存在数据。我是否从Xcode构建和运行都没关系或简单地从设备启动应用程序。数据立即出现如果是从Xcode启动的,我会在控制台中收到以下内容:

2015-05-04 15:35:03.542 Bioplogcloud [1358:735588] -pfubiquicityswitchboardenrymetadata setuselocalstorage :: coredata:Ubiquity: 手机〜C1432E0B-D885-418C-996C-5E6CDD45D7F1:使用BioplogCloudStore使用 本地存储:1 count是12 2015-05-04 15:35:04.062 Bioplogcloud [1358:735625] -pfubiquicityswitchboardenrymetadata 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

一种情况是,您要么不听NSPersistentStoreDidImportUbiquitousContentChangesNotification或在到达时不更新表视图。该通知是您知道新数据已经从iCloud到达的。如果您无法正确处理它,则您的应用程序不会显示任何新数据,直到您强迫它重新加载数据(例如杀死应用程序并重新发布)。

我在这个问题上也很尴尬地挣扎。似乎在本地创建过程中的某个地方表视图控制器认为它确实没有数据时与数据有很好的连接。

如果您使用的是标准Xcode应用程序对表视图,则提取结果控制器和iCloud我发现,当商店更改时,我需要做的只是在通知中心调用的函数中放置一些代码。

Xcode设置一个助手FetchedResultScontroller

var _fetchedResultsController: NSFetchedResultsController? = nil

如果将其设置为零,请致电以fetchedresultscontroller进行娱乐,您应该很好。同样,我使用的标准变量FRC是:

var fetchedResultsController: NSFetchedResultsController {
    if _fetchedResultsController != nil {
        return _fetchedResultsController!
    }
    ...bunch more code
}

因此,在我命名handlestoresdidchange(..)的函数中,nil nil frc并重新创建

func handleStoresDidChange(notification : NSNotification) {
    print("storesDidChange notification:(notification)")
    self.view.userInteractionEnabled = true
    _fetchedResultsController = nil
    self.fetchedResultsController
    tableView.reloadData()
}//handleStoresDidChange

希望对您有用。

最新更新