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

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

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

Любые идеи?

Ответы

Ответ 1

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

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

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


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

@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.