17

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

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

有任何想法吗?

4

1 回答 1

19

不,由于各种原因,这是不可能的。块中包含的数据不以任何类似于实例变量的方式表示。没有状态清单,因此无法为存档目的枚举状态。

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

您可能会发现这个问题的答案很有趣。这是相关的。


为了扩展,假设您有一个类似的课程:

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

From there, you could implement archiving on MyData, save it away, etc... The key is treat the Block as the trigger for doing the computation and encapsulate said computation and the computation's necessary state into the instance of the MyData class.

于 2010-01-31T18:47:43.340 回答