Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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
Xcode Cocoa-如何检测ubiquity容器中的变化_Xcode_Cocoa_Icloud - Fatal编程技术网

Xcode Cocoa-如何检测ubiquity容器中的变化

Xcode Cocoa-如何检测ubiquity容器中的变化,xcode,cocoa,icloud,Xcode,Cocoa,Icloud,我有一个OSX应用程序,通过一个ubiquity容器将一个文档前后同步到一个与iOS等效的应用程序。iOS应用程序在Mac端每次更改都会接收数据,在iOS端每次更改都会发送数据(因此iOS应用程序正在全面运行),Mac应用程序在Mac端每次更改都会发送数据,并在应用程序启动时接收数据,但在运行时似乎不会再次检查任何数据。我希望它能立即自动更新任何更改,就像OSX“Notes”应用程序在iOS端的更改一样 在启动时,将调用以下相关函数: +(NSMutableDictionary *)getAll

我有一个OSX应用程序,通过一个ubiquity容器将一个文档前后同步到一个与iOS等效的应用程序。iOS应用程序在Mac端每次更改都会接收数据,在iOS端每次更改都会发送数据(因此iOS应用程序正在全面运行),Mac应用程序在Mac端每次更改都会发送数据,并在应用程序启动时接收数据,但在运行时似乎不会再次检查任何数据。我希望它能立即自动更新任何更改,就像OSX“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];
}
我认为问题在于,我的代码中没有任何部分与短语“定期检查以查看ubiquity容器是否已更改,然后执行…”等相当。我确信这有一个众所周知的过程(在
NSDocument
中的某个通知事件或类似事件),但我四处搜索,发现的所有东西要么是iOS/UIDocuments,而不是OSX/NSDocuments,要么都是理论,在我的头脑中,没有任何有形的代码样本可供梳理和区分

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

提前谢谢你


PS我还是一个初学者,所以教程和代码示例非常受欢迎。

您正在寻找NSMetadataQuery—它可以像聚光灯一样连续搜索任何类型的文件—并且在iOS和OS X上都可用(事实上,在iOS上,它只能用于观察对ubiquity容器的更改)。我没有任何一个关于如何使用它的链接——苹果文档太笼统了,一开始没有多大意义,但在“NSMetadataQuery iCloud”上搜索一下,你应该会被分类——关于这个主题有很多信息


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

您正在寻找NSMetadataQuery-它会像,持续运行搜索任何类型的文件-并且在iOS和OS X上都可用(实际上在iOS上,它只能用于观察对ubiquity容器的更改)。我没有任何一个关于如何使用它的链接——苹果文档太笼统了,一开始没有多大意义,但在“NSMetadataQuery iCloud”上搜索一下,你应该会被分类——关于这个主题有很多信息


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

的确,NSMetadataQuery是—它感觉像是一种黑客行为,但似乎是监视对标准文档的更改的唯一方法(非UIDocument)文件

下面是我编译的一个示例项目。它允许您从相机卷上载图像,然后监视对“无处不在的文档”文件夹的更改:


事实上,NSMetadataQuery就是这样——它感觉像是黑客攻击,但似乎是监控标准(非UIDocument)文件更改的唯一方法

下面是我编译的一个示例项目。它允许您从相机卷上载图像,然后监视对“无处不在的文档”文件夹的更改:


谢谢!我能要求澄清一下吗:我会在CloudDocument对象(从NSDocument子类)的初始化方法中设置NSMetadataQuery吗?或者我是在ApplicationIDFinishLaunching中做的,还是什么?我对NSMetadataQuery、通知和所有这些东西都不熟悉,所以非常感谢您在设置这些东西时提供的任何建议。您可以在任何地方提供。在我的应用程序上,我使用URLForUbiquityContainerIdentifier确定ubiquity URL后创建它:并且只有当用户已打开iCloud。这是有意义的,因为如果您没有有效的ubiquity URL,则设置查询没有意义。有无数种不同的方法可以实现这一点,只需选择对您的应用程序更自然的方式。我倾向于使用“CloudController”对象来观察ubiquity容器中的情况并作出反应对于用户注销、云可用性等问题,我将元数据查询放在这里。谢谢!如果您有时间(和意愿),你能谈谈这个话题吗?另一个用户一直在帮助我,但一个评论线程已经开发出来,我正试图准确地跟踪剩余的问题是什么。据我所知,除了不知道文件扩展名之外,我已经正确地设置了所有代码,但可能还有另一个问题。我离finishi非常近我可以试用这个应用程序。再次感谢您的帮助!谢谢!我可以要求澄清一下:我会在CloudDocument对象(从NSDocument子类)的初始化方法中设置NSMetadataQuery吗?或者我是在ApplicationIDFinishLaunching中做的,还是什么?我对NSMetadataQuery、通知和所有这些东西都不熟悉,所以非常感谢您在设置这些东西时提供的任何建议。您可以在任何地方提供。在我的应用程序上,我使用URLForUbiquityContainerIdentifier确定ubiquity URL后创建它:并且只有当用户已打开iCloud。这是有意义的,因为设置quer没有意义