【问题标题】:Encoding an Objective-c Block?编码一个 Objective-c 块?
【发布时间】:2010-01-31 18:20:41
【问题描述】:

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

我认为 Block 对象不符合 NSCoding 标准,因此 [coder encodeObject:block forKey:@"block"] 不起作用?

有什么想法吗?

【问题讨论】:

    标签: objective-c objective-c-blocks nscoding


    【解决方案1】:

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

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

    您可能会找到这个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 类的实例中.

    【讨论】:

    • 谢谢你的回答,我想我明白为什么简单地对它们进行编码并不简单。但是,我对您使用类来保存块使用的状态的建议感到困惑。你能扩展如何实现它吗?在我的情况下,我有基本的 void 回调块,即 void^{ do_stuff; }。谢谢!
    • 可以很容易地成为实例变量...但不能取消/归档,这违反直觉。通过违反直觉,我的意思是,蹩脚。赞成作为唯一的答案,但需要注意的是,我猜确实有一种方法......不知何故,某处。
    • @alexgray 大量对象可能是无法归档/取消归档的实例变量(每个不支持 NSCopying 的类)。一个块可归档意味着什么?所有捕获的对象都必须是可归档的吗?如果它捕获一个随机结构怎么办?也要存档吗?架构/字节序依赖项呢?这些由归档程序 API 自动处理。那么块是否必须增加实现自定义归档的能力?除了维护是一场噩梦之外,这将很难在“套件”中得到支持(投资回报率很小)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 2011-03-26
    相关资源
    最近更新 更多