5

我想在核心数据NSManagedObject中保留一个块(如果可能的话)。我有一个NSManagedObject的继承类。 该类有一个块来满足一些异步调用。我尝试将该块存储为Transformable和Transient属性。当我尝试调用块之前加载我的NSManagedObject我有一个不良的内存访问"EXC_BAD_ACCESS"是否可以在NSManagedObject中存储块?

如果我不检查的变形标志我有类似这样的例外:

-[__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]; 

回答

3

你不能将块存储为可变形类型。根据Apple documentation可变形的对象必须转换为NSData。块不能转换为NSData,因为它是编译器对编译代码的引用,而不是可以移动的一些数据。

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

相关问题