gpt4 book ai didi

xcode - Cocoa - 如何检测无处不在的容器中的变化

转载 作者:行者123 更新时间:2023-12-03 17:30:17 28 4
gpt4 key购买 nike

我有一个 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 我还是一个初学者,所以非常感谢教程和代码示例。

最佳答案

您正在寻找 NSMetadataQuery - 它可以像聚光灯一样连续运行搜索任何类型的文件 - 并且在 iOS 和 OS X 上都可用(实际上在 iOS 上它只能用于观察普遍存在的变化容器)。我没有任何关于如何使用它的链接 - Apple 文档太笼统,一开始没有多大意义,但在“NSMetadataQuery iCloud”上搜索一下,你应该得到排序 - 关于这个主题有大量信息.

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

关于xcode - Cocoa - 如何检测无处不在的容器中的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17117124/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com