【发布时间】:2010-01-31 18:20:41
【问题描述】:
是否可以使用 NSKeyedArchiver 对 Objective-C 块进行编码?
我认为 Block 对象不符合 NSCoding 标准,因此 [coder encodeObject:block forKey:@"block"] 不起作用?
有什么想法吗?
【问题讨论】:
标签: objective-c objective-c-blocks nscoding
是否可以使用 NSKeyedArchiver 对 Objective-C 块进行编码?
我认为 Block 对象不符合 NSCoding 标准,因此 [coder encodeObject:block forKey:@"block"] 不起作用?
有什么想法吗?
【问题讨论】:
标签: objective-c objective-c-blocks nscoding
不,由于各种原因,这是不可能的。块中包含的数据不会以任何类似于实例变量的方式表示。没有状态清单,因此无法为存档目的枚举状态。
相反,我建议您创建一个简单的类来保存您的数据,其实例带有块在处理过程中使用的状态并且可以轻松存档。
您可能会找到这个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 上实现归档,将其保存等...关键是将 Block 视为执行计算的触发器,并将所述计算和计算的必要状态封装到 MyData 类的实例中.
【讨论】: