Когда включено NSDocument Asynchronous Saving, есть ли смысл вызывать -unblockUserInteraction в простом -dataOfType: error :? - PullRequest
4 голосов
/ 29 октября 2011

У меня есть простое приложение для Mac OS X, Cocoa, Document, которое использует новые API 10.7 Autosave, Versions and Asychronous Saving.Я полностью использую API NSDocument, чтобы бесплатно получить все функции приложений Apple для работы с документами.

Для поддержки нового автосохранения Lion / Versions / AsyncSaving я переопределил следующие методы в моем NSDocument подкласс выглядит так:

@implementation MyDocument 
...
+ (BOOL)autosavesInPlace { return YES; }

- (BOOL)canAsynchronouslyWriteToURL:(NSURL *)URL ofType:(NSString *)type forSaveOperation:(NSSaveOperationType)op {
    return YES;
}

Я также переопределил -dataOfType:error:, чтобы помочь реализовать сохранение данных документа на диск:

- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outErr {
    NSData *data = nil;

    if ([typeName isEqualToString:MY_SUPPORTED_TYPE_NAME]) {
        data = makeSnapshotCopyOfMyDocumentData(); // assume return value is autoreleased
    } else if (outErr) {
        *outErr = [NSError errorWithDomain:NSOSStatusErrorDomain code:unimpErr userInfo:nil];
    }

    // not sure this is doing much good, since i take no action after this.
    [self unblockUserInteraction];

    return data;
}
...
@end

Посмотрите, как я звоню -unblockUserInteractionв конце концов?

При поддержке новой функции AsyncSaving 10.7 Apple рекомендует вызывать -unblockUserInteraction как можно раньше (после создания моментальной копии данных вашего документа) в вашей реализации -dataOfType:error:.Но пример Apple показал, что они выполняют гораздо больше работы после вызова -unblockUserInteraction.

Однако, учитывая то, что после этого я не предпринимаю никаких других действий, мне интересно, есть ли смысл вообще там звонить -unblockUserInteraction.

Итак, мои вопросы:

  1. Учитывая, что после этого я не предпринял никаких других действий, мой призыв к -unblockUserInteraction приносит пользу?

  2. Apple Frameworks просто вызывает -unblockUserInteraction сразу после того, как -dataOfType:error: все равно возвращается?Должен ли я просто оставить это им?

1 Ответ

4 голосов
/ 29 октября 2011

Я только что заметил небольшую разницу в формулировках между документацией NSDocument и комментарием в NSDocument.h:

Docs:

Если saveToURL: ofType: forSaveOperation: завершениеHandler: пишет на неосновная нить, потому что canAsynchronouslyWriteToURL: ofType: forSaveOperation: вернул YES, но он все еще блокирует основной поток, этот метод разблокирует Основная тема. В противном случае ничего не происходит.

Заголовок:

Если -saveToURL: ofType: forSaveOperation: завершениеHandler: запись в неосновная нить, потому что -canAsynchronouslyWriteToURL: ofType: forSaveOperation: вернул YES, но все еще блокирует основной поток, разблокировать основной поток. В противном случае ничего не делать.

Полагаю, заголовок более актуален.

Я работаю над приложением, которое вызывает unblockUserInteraction после последней строки, которая должна выполняться в главном потоке. (По крайней мере, я так понял)
Я думаю, что наш код соответствует сценарию, который Apple имела в виду при разработке асинхронной сохраняющей части NSDocument:

в fileWrapperOfType: мы ...

  • создайте предварительный просмотр QL для нашей файловой оболочки (которая должна выполняться на основная нить) ...
  • unblockUserInteraction ...
  • ... «долго» запущенная задача сохранения файла (включая сжатие)
...