是否可以在NSManagedObject中存储块?

时间:2012-03-22 16:35:46

标签: ios automatic-ref-counting objective-c-blocks nsmanagedobject

如果可能的话,我想在核心数据NSManagedObject中保留一个块。我有一个来自NSManagedObject的继承类。 这个类有一个块来满足一些异步调用。我试图将块存储为Transformable和Transient属性。当我在加载NSManagedObject之前尝试调用块时,我的内存访问权限为"EXC_BAD_ACCESS"

如果我没有检查可转换标志,我有一个类似的例外:

-[__NSStackBlock__ encodeWithCoder:]: unrecognized selector sent to instance 0xbfffd930

我是iOS的新手。我在支持ARC的iOS 5 SDK下工作。这是我的代码摘录:

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@class ModbusRegister, Board;
typedef void (^DataBlockType)(NSArray *listRegister);

@interface EnergyEntry : NSManagedObject
- (void)invokeWithData: (NSArray *)listRegister;

@property (nonatomic, copy) DataBlockType  datablock;

@end

#import "EnergyEntry.h"

@implementation EnergyEntry

@dynamic datablock;

- (void)invokeWithData: (NSArray *)listRegister{

    self.datablock(listRegister);
}

@end

当我试图存储块时:

[energyEntry setValue:@"Energía activa" forKey:@"name"];
[energyEntry setValue:[NSNumber numberWithDouble:0] forKey:@"value"];
[energyEntry setValue:currentBoard forKey:@"board"];

[energyEntry setValue:^(NSArray *listRegister){
    //...my block operations to store
} forKey:@"datablock"];

最后,当我调用块并触发错误时:

NSArray *listRegister=... //my ready array
[energyEntry invokeWithData:listRegister];

1 个答案:

答案 0 :(得分:3)

您无法将块存储为可转换类型。根据{{​​3}},可转换对象必须可转换为NSData。块无法转换为NSData,因为它是编译器对已编译代码的引用,而不是可以移动的一些数据。

请注意,该块就像一个匿名方法。您可以多次调用它,每次使用不同的参数。因此,没有什么能阻止您存储块一次并在每个异步调用中分别调用它多次。如果您认为需要很多块,那么很可能您只需要存储应该传递给每个块调用的数据。