iCloud: получение массива текстовых файлов, представленных в облаке на OS X - PullRequest
1 голос
/ 17 марта 2012

Я пытаюсь получить массив txt-файлов в папке iCloud моего приложения, используя NSMetadataQuery в соответствии с рекомендациями Apple:

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 Ответ

3 голосов
/ 18 марта 2012

Вы используете ARC, а это значит, что вам нужно сохранять четкую ссылку на объекты, которые вы выделяете, или они исчезнут.

Вы вызываете alloc для вашего query объекта, что в случае ручного сохранения / разблокирования будет означать, что объект query останется живым, пока вы не отправите ему сообщение release или autorelease.

Однако в ARC компилятор вставляет эти вызовы для вас, и поскольку он не знает, что вы хотите, чтобы объект query оставался без присмотра, он освобождает объект query после того, как вы вызовете [query startQuery]. Поскольку объект был освобожден, он никогда не публикует уведомление.

Вместо этого вы должны иметь сильную ссылку на объект query. Самый простой способ сделать это - сделать его переменной экземпляра или свойством strong.

@interface YourObject : NSObject
{
    NSMetadataQuery *query;
}
@end

или

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