0

我有一个 OS X 应用程序通过一个普遍存在的容器来回同步单个文档到一个 iOS 等效应用程序。iOS 应用程序在 Mac 端发生变化时接收数据,并在 iOS 端发生变化时发送数据(因此 iOS 应用程序正在运行),Mac 应用程序在 Mac 端发生变化时发送数据,并且在启动应用程序时接收数据,但它似乎在运行时没有再次检查任何数据。我希望它能够立即自动更新任何更改,就像 OS X“Notes”应用程序从 iOS 端的更改中所做的那样。

在启动时,这是被调用的相关函数:

+(NSMutableDictionary *)getAllNotes {
    if(allNotes == nil) {
        allNotes = [[NSMutableDictionary alloc]initWithDictionary:[[NSUserDefaults standardUserDefaults] dictionaryForKey:kAllNotes]];

        cloudDoc = [[CloudDocument alloc]initWithContentsOfURL:[self notesURL] ofType:NSPlainTextDocumentType error:nil];
        [cloudDoc saveToURL:[self notesURL] ofType:NSPlainTextDocumentType forSaveOperation:NSSaveOperation error:nil];
    }
    return allNotes;
}

并且“CloudDocument”类(它是 的子类NSDocument)包括:

#import "Data.h"

@implementation CloudDocument

-(NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError {
    return [NSKeyedArchiver archivedDataWithRootObject:[Data getAllNotes]];
}

-(BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError {
    NSDictionary *dict = (NSDictionary *)[NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)data];
    [Data didReceiveCloudData:dict];
    return YES;
}

+(BOOL)autosavesInPlace {
    return YES;
}

@end

这将其踢回:

+(void)didReceiveCloudData:(NSDictionary *)d {
    allNotes = [[NSMutableDictionary alloc]initWithDictionary:d];
    [[NSUserDefaults standardUserDefaults] setObject:allNotes forKey:kAllNotes];

    [cloudDoc updateChangeCount:NSChangeDone];
}

我认为问题在于我的代码中没有任何部分等同于“定期检查无处不在的容器是否已更改,然后执行...”等短语。我确定有众所周知的过程(一些通知事件NSDocument或其他东西),但我已经四处搜索,我发现的一切要么是针对 iOS/UIDocuments 而不是 OS X/NSDocuments,要么是所有的理论和我的头脑,没有任何有形的代码样品梳理和挑选。

任何人都可以帮助我提供一种方法来注册无处不在的容器中的 iCloud 文档已更改,以及理想的放置位置(AppDelegate、CloudDocument.m 等)吗?我只有一个文件在同步,由常量表示kAllNotes,所以我不需要跟踪一堆不同的文件或任何东西。我很确定我可以使用在启动时运行的代码来做需要做的事情,我只是不知道该怎么做才能启动自动同步过程。

先感谢您!

PS我仍然是初学者,因此非常感谢教程和代码示例。

4

2 回答 2

3

您正在寻找 NSMetadataQuery - 它对任何类型的文件进行类似聚光灯的持续运行搜索 - 并且在 iOS 和 OS X 上都可用(实际上在 iOS 上它只能用于观察对无处不在容器的更改)。我没有任何关于如何使用它的链接 - Apple 文档太笼统,最初没有多大意义,但是在“NSMetadataQuery iCloud”上进行搜索,你应该被排序 - 关于这个主题有大量信息.

使用 NSMetadataQuery 时,您会在观察到的文件夹系统中的某些内容发生更改时收到通知,并且它不仅适用于 UIDocument 文件,即使很多示例都担心 UIDocuments。

于 2013-06-15T12:02:37.707 回答
2

确实,NSMetadataQuery 确实如此——感觉就像是一种 hack,但似乎是监视标准(非 UIDocument)文件更改的唯一方法。

这是我编译的示例项目。它允许您从相机胶卷上传图像,然后监视对无处不在的 Documents 文件夹的更改:

https://github.com/versluis/iCloud-Images

于 2013-12-17T02:40:37.300 回答