2010-01-31 14 views
17

是否可以使用NSKeyedArchiver对Objective-C块进行编码?对Objective-C块进行编码?

我不认为一个Block对象是NSCoding兼容,因此[coder encodeObject:block forKey:@"block"]不起作用?

任何想法?

回答

19

不,不可能有多种原因。块中包含的数据没有以任何方式表示,例如,类似于实例变量。没有国家清单,因此没有办法列举国家的档案目的。

相反,我建议您创建一个简单的类来保存您的数据,其中的实例包含处理期间块使用的状态,并且可以轻松进行归档。

您可能会找到对此question interesting的答案。这是相关的。


扩大,说你有一个类,如:

@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类的实例中。

+0

谢谢你的回答,我想我明白为什么简单地编码它们并不简单。但是我对你使用一个类来保持块使用的状态的建议感到困惑。 你能扩展如何实现吗? 在我的情况下,我有基本的无效回调块,即void^{do_stuff; }。 谢谢! – rebo

+0

块_很容易成为实例变量_...,但不能被取消/存档,这是违反直觉的。相反,我的意思是,_lame_。 Upvoted作为唯一的答案,与我的猜测是,这确实是一种方式...不知何故,某处。 –

+3

@alexgray对象的吨可以是实例变量,不能存档/非存档(每个类不支持NSCopying)。这对于一个区块来说意味着什么呢?所有被捕获的物体是否也必须存档?如果它捕获一个随机结构呢?还要归档吗?什么是架构/ endian依赖?这些由存档器API自动处理。那么块会不得不增加实施定制归档的能力?除了是一个噩梦来维持,这将是非常难以支持'套件(很少投资回报率)。 – bbum