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