如何强制 iCloud 与核心数据进行同步?

Posted

技术标签:

【中文标题】如何强制 iCloud 与核心数据进行同步?【英文标题】:How to force iCloud with core data to do sync? 【发布时间】:2012-07-01 13:09:24 【问题描述】:

我正在使用带有核心数据的 iCloud 来同步我的应用程序的数据。

我尝试了一切,最后它完美运行。

但我有一个问题。

有什么方法可以让 iCloud 同步吗?

它在应用程序开始时同步,但在其他时间。好像是随机同步的。我自己找不到处理的方法。

有什么帮助吗?

谢谢。

【问题讨论】:

同样的问题.. 我也想强制同步 【参考方案1】:

我想出了如何强制核心数据存储同步到 iCloud。您只需“触摸” Ubiquity 文件系统中 Data 文件夹中的任何收据文件。下面的代码将执行此操作。要强制同步,请调用 syncCloud 方法。对于它找到的每个“收据”文件,它会将文件修改时间戳更新为当前时间,本质上是对文件进行“触摸”。一旦发生这种情况,iCloud 将检查并同步所有需要在 iCloud 中同步的核心数据文件。据我所知,当您选择“触发 iCloud 同步”选项时,模拟器或 Xcode 就是这样做的。

@property (strong, nonatomic) NSMetadataQuery  *query;

-(void) init

    self.query = [[NSMetadataQuery alloc] init];

    [[NSNotificationCenter defaultCenter] addObserver: self
                                             selector: @selector(didFinishMetadataQuery)
                                                 name: NSMetadataQueryDidFinishGatheringNotification
                                               object: self.query];


-(void) didFinishMetadataQuery

    // Query completed so mark it as completed
    [self.query stopQuery];

    // For each receipt, set the modification date to now to force an iCloud sync
    for(NSMetadataItem *item in self.query.results)
    
        [[NSFileManager defaultManager] setAttributes: @NSFileModificationDate:[NSDate date]
                                         ofItemAtPath: [[item valueForAttribute: NSMetadataItemURLKey] path]
                                                error: nil];
    


-(void) syncCloud

    // Look for files in the ubiquity container data folders
    [self.query setSearchScopes:@[NSMetadataQueryUbiquitousDataScope]];

    // Look for any files named "receipt*"
    [self.query setPredicate:[NSPredicate predicateWithFormat:@"%K like 'receipt*'", NSMetadataItemFSNameKey]];

    // Start the query on the main thread
    dispatch_async(dispatch_get_main_queue(), ^
        BOOL startedQuery = [self.query startQuery];
        if (!startedQuery)
        
            NSLog(@"Failed to start query.\n");
            return;
        
    );

【讨论】:

【参考方案2】:

您必须使用此方法强制将任何 NSURL 项目缓存在 iCloud 中:

- (BOOL)addBackupAttributeToItemAtURL:(NSURL *)URL

    NSLog(@"URL: %@", URL);
    assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);

    NSError *error = nil;
    BOOL success = [URL setResourceValue: [NSNumber numberWithBool: NO]
                                  forKey: NSURLIsExcludedFromBackupKey error: &error];
    return success;

您需要在 Documents 或 Library 目录中下载/创建的每个目录和文件上启动此方法。

【讨论】:

【参考方案3】:

我认为您无法控制在使用 iCloud 和核心数据时何时会发生同步。使用 UIDocument 和 iCloud,我使用 startDownloadingUbiquitousItemAtURL 取得了不同程度的成功,但对于核心数据,我认为没有任何等价物——但我很想听到有人告诉我……

【讨论】:

以上是关于如何强制 iCloud 与核心数据进行同步?的主要内容,如果未能解决你的问题,请参考以下文章

使用 iCloud 进行核心数据同步

将 sqlite 数据库与 iCloud 同步

将核心数据与 iCloud 同步 - 不包括实体

如何阻止核心数据同步到 iCloud

iOS 核心数据存储在 iCloud 中以与其他设备同步

我如何在 iCloud 中同步核心数据?(OS X Lion 应用程序)