Кодирование блока Objective-C? - PullRequest
       21

Кодирование блока Objective-C?

17 голосов
/ 31 января 2010

Можно ли кодировать блок Objective-C с помощью NSKeyedArchiver?

Я не думаю, что объект Block * NSCoding -совместим, поэтому [coder encodeObject:block forKey:@"block"] не работает?

Есть идеи?

1 Ответ

19 голосов
/ 31 января 2010

Нет, это невозможно по разным причинам.Данные, содержащиеся в блоке, никак не похожи, например, на переменные экземпляра.Нет инвентаризации состояния и, следовательно, нет способа перечислить состояние для архивных целей.

Вместо этого я бы предложил вам создать простой класс для хранения ваших данных, экземпляры которого содержат состояние, используемоеблоки во время обработки и которые могут быть легко заархивированы.

Вы можете найти ответ на этот вопрос интересным .Это связано.

Чтобы расширить, скажем, у вас есть класс, такой как:

@interface MyData:NSObject
{
    ... ivars representing work to be done in block
}

- (void) doYourMagicMan;
@end

Тогда вы можете:

MyData *myWorkUnit = [MyData new];

... set up myWorkUnit here ...

[something doSomethingWithBlockCallback: ^{ [myWorkUnit doYourMagicMan]; }];

[myWorkUnit release]; // the block will retain it (callback *must* Block_copy() the block)

Оттуда вы можете реализовать архивирование на MyData, сохранить его и т. Д.... Ключ обрабатывает Блок как триггер для выполнения вычислений и инкапсулирует эти вычисления и необходимое состояние вычислений в экземпляр класса MyData.

...