Кодирование объективного-c блока?

Действительно ли возможно закодировать блок Objective C NSKeyedArchiver?

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

Какие-либо идеи?

17
задан Mohsen Nosratinia 8 May 2015 в 14:14
поделиться

1 ответ

Обычно для выполнения этой задачи используются классы 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.

19
ответ дан 30 November 2019 в 13:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: