代码之家  ›  专栏  ›  技术社区  ›  rebo

编码Objective-C块?

  •  17
  • rebo  · 技术社区  · 16 年前

    是否可以用 NSKeyedArchiver ?

    我不认为块对象是 NSCoding -因此,符合 [coder encodeObject:block forKey:@"block"] 不起作用吗?

    有什么想法吗?

    1 回复  |  直到 11 年前
        1
  •  19
  •   Community Mohan Dere    9 年前

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

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

    你可能会找到答案 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类的实例中。