可可 - 如何检测无处不在容器的变化

时间:2013-06-14 20:55:45

标签: xcode cocoa icloud

我有一个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,或者它都是理论在我的头上没有任何有形的代码样本梳理和分开。

任何人都可以帮我解决一个方法,即注册ubiquity容器中的iCloud文档已经改变了,理想情况下放在哪里(AppDelegate,CloudDocument.m等)?我只有一个文件同步,由常量kAllNotes表示,所以我不需要跟踪一堆不同的文件或任何东西。我很确定我可以使用在启动时运行的代码来执行需要完成的操作,我只是无法弄清楚如何启动自动同步过程。

提前谢谢!

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

2 个答案:

答案 0 :(得分:3)

您正在寻找NSMetadataQuery - 它可以像聚光灯一样,持续运行搜索任何类型的文件 - 并且可以在iOS和OS X上使用(实际上在iOS上它只能用于观察无处不在的变化)容器)。我没有关于如何使用它的任何一个链接 - Apple文档过于笼统而不是最初有意义但是搜索'NSMetadataQuery iCloud'并且您应该排序 - 有关此主题的大量信息

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

答案 1 :(得分:2)

事实上,NSMetadataQuery就是 - 它感觉像是一个黑客,但似乎是监视标准(非UIDocument)文件更改的唯一方法。

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

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