iCloud:在 OS X 上获取云中存在的一系列 txt 文件

Posted

技术标签:

【中文标题】iCloud:在 OS X 上获取云中存在的一系列 txt 文件【英文标题】:iCloud: Getting an array of txt files present in the cloud on OS X 【发布时间】:2012-03-17 03:25:36 【问题描述】:

我正在尝试使用 Apple 推荐的 NSMetadataQuery 在我的应用程序的 iCloud 文件夹中获取一组 txt 文件:

NSMetadataQuery *query = [[NSMetadataQuery alloc] init];
[query setSearchScopes:[NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]]; 

NSPredicate *pred = [NSPredicate predicateWithFormat:@"%K ENDSWITH '.txt'", NSMetadataItemFSNameKey];
[query setPredicate:pred];

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

[query startQuery];

不幸的是 queryDidFinishGathering: 永远不会被调用。我做错了什么?

谢谢!

【问题讨论】:

【参考方案1】:

您正在使用 ARC,这意味着您需要保留对您分配的对象的强引用,否则它们将消失。

您在 query 对象上调用 alloc,这在手动保留/释放下意味着 query 对象将保持活动状态,直到您向其发送 releaseautorelease 消息。

但是,在 ARC 下,编译器会为您插入这些调用,因为它不知道您希望 query 对象保留,它会在您调用 [query startQuery] 后释放 query 对象。因为该对象已被释放,所以它永远不会发布通知。

您应该持有对query 对象的强引用。最直接的方法是将其设置为实例变量或strong 属性。

@interface YourObject : NSObject

    NSMetadataQuery *query;

@end

@interface YourObject : NSObject
@property (strong) NSMetadataQuery *query;
@end

【讨论】:

以上是关于iCloud:在 OS X 上获取云中存在的一系列 txt 文件的主要内容,如果未能解决你的问题,请参考以下文章

仅为 OS X 10.8.x 和 iOS 6.x 在 iCloud 中启用核心数据同步

现有的 UIDocument 不会在 iCloud 上更新

防止在 OS X 中启动时出现 iCloud 打开文件对话框 [重复]

在重新加载文档之前,如何在 OS X 上的 iCloud 中检测对 Core Data 文档的更改?

检测 OS X 上的 iCloud 可用性变化

在 iOS 和 OS X 之间共享 iCloud 核心数据