Действительно ли возможно закодировать блок Objective C NSKeyedArchiver
?
Я не думаю, что объект Блока NSCoding
- совместимый, поэтому [coder encodeObject:block forKey:@"block"]
не работает?
Какие-либо идеи?
Обычно для выполнения этой задачи используются классы System.Reflection.
В частности, можно загрузить DLL через Assembly.Load (или Assembly.LoadFrom ), а затем вызвать Assembly.GetTypes , а затем для каждого типа вызвать Type.GetMethods . При наличии MethodInfo можно вызвать MethodInfo.Invoke .
-121--3329790-Не так элегантно, но работает. Создание таблицы с одной ячейкой. Только таблица имеет вертикальное выравнивание в браузере.
-121--2225258-Нет, это невозможно по различным причинам. Данные, содержащиеся в блоке, никоим образом не представлены аналогично переменным экземпляра. Нет описи государства и, таким образом, нет пути перечислить государство в архивных целях.
Вместо этого я бы предложил вам создать простой класс для хранения ваших данных, экземпляры которого несут состояние, используемое блоками во время обработки, и которые можно легко архивировать.
Ответ на этот вопрос может оказаться интересным . Это связано.
Чтобы расширить, скажите, что у вас был такой класс, как:
@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.