Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iCloud、核心数据和iOS 7中web服务的数据_Ios_Objective C_Core Data_Icloud_Core Data Migration - Fatal编程技术网

iCloud、核心数据和iOS 7中web服务的数据

iCloud、核心数据和iOS 7中web服务的数据,ios,objective-c,core-data,icloud,core-data-migration,Ios,Objective C,Core Data,Icloud,Core Data Migration,我正在编写一个非常简单的应用程序,用于跟踪、存储和组织从iTunes和Rottentomotos下载的电影。我把电影放在一个大的后面,通常一次大约150部电影。然后,用户可以查看提要并将电影添加到自定义列表中 我遇到的问题是从网络上提取数据,并与iCloud同步,生成电影的副本 我一直在考虑将电影提要拆分为本地存储(从iCloud中删除),然后在单独的iCloud核心数据存储中创建列表和其他用户值,甚至使用iCloud键值存储(尽管保存电影列表可能很困难) 这是我第一个使用iCloud的应用程序

我正在编写一个非常简单的应用程序,用于跟踪、存储和组织从iTunes和Rottentomotos下载的电影。我把电影放在一个大的后面,通常一次大约150部电影。然后,用户可以查看提要并将电影添加到自定义列表中

我遇到的问题是从网络上提取数据,并与iCloud同步,生成电影的副本

我一直在考虑将电影提要拆分为本地存储(从iCloud中删除),然后在单独的iCloud核心数据存储中创建列表和其他用户值,甚至使用iCloud键值存储(尽管保存电影列表可能很困难)

这是我第一个使用iCloud的应用程序,所以我使用的是来自的一些样板文件。我做了一些修改,因为我的web同步使用后台NSManagedObjectContext来完成工作。后台MOC保存,然后我的主MOC合并中的更改。UI主要是NSFetchedResultsController,因此整个系统可以无缝工作

下面是一些处理iCloud通知的代码

// happens when the main MOC saves
- (void)managedObjectContextDidSaveNotification:(NSNotification *)notification {
    @synchronized(self) {
        NSManagedObjectContext *moc = self.backgroundManagedObjectContext;

        [moc performBlock:^{
            [moc mergeChangesFromContextDidSaveNotification:notification];
        }];
    }
}

// happens when the bg MOC saves
- (void)backgroundManagedObjectContextDidSaveNotification:(NSNotification *)notification {
    @synchronized(self) {
        NSManagedObjectContext *moc = self.managedObjectContext;

        [moc performBlock:^{
            [moc mergeChangesFromContextDidSaveNotification:notification];
        }];
    }
}

- (void)persistentStoreDidImportUbiquitousContentChanges:(NSNotification *)notification {
    @synchronized(self) {
        NSManagedObjectContext *moc = self.managedObjectContext;

        [moc performBlock:^{
            [moc mergeChangesFromContextDidSaveNotification:notification];
        }];
    }
}

- (void)storesWillChange:(NSNotification *)notification {
    NSManagedObjectContext *moc = self.managedObjectContext;

    [moc performBlockAndWait:^{            
        NSError *error = nil;
        if ([moc hasChanges] && [moc save:&error]) {
            DDLogInfo(@"MOC saved succesfully");
        }
        else {
            DDLogError(@"Error saving MOC: %@",error);
        }
    }];
}

- (void)storesDidChange:(NSNotification *)notification {}
我原本以为在iCloud完成合并更改后,我可以添加一些逻辑,但这看起来不太可靠,因为我可能会在设备之间的更改循环中结束


有没有想过如何才能做到这一点?我相信人们以前都这么做过,我只是找不到任何有用的资源。

如果我正确理解您的情况,用户可能会同时在两台不同的设备上下载同一部电影,同步后,您就有了电影的副本

对于这种情况,苹果的建议只是在任何iCloud合并后进行重复数据消除。您执行提取以查找具有相同电影id的对象,并以确定的方式对重复项进行排序,然后删除一个。如果不对它们进行排序,则可能会删除一个设备上的一个对象,并删除另一个设备上的另一个对象,最终没有对象

本文提供了查找副本的有效代码:


如果您不喜欢整个合并后重复数据消除过程,那么像和这样的框架允许您提供全局ID,从而消除重复数据消除的必要性。(披露:我开发了集成)

因此,通过排序,这是否可以避免任何类型的“删除周期”,即一台设备删除dup a,另一台设备删除dup b,它们同步a和b,然后重复?理论上,两个设备都会删除dup a?是的。他们的想法是,他们都应该删除相同的东西。如果发生这种情况,就不应该有任何乒乓球或数据丢失。