ios - 是否可以在 NSManagedObject 中存储一个 block ?

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

如果可能的话,我想在核心数据 NSManagedObject 中保留一个 block 。我有一个从 NSManagedObject 继承的类。 这个类有一个 block 来满足一些异步调用。我试图将 block 存储为 Transformable 和 Transient 属性。当我尝试在加载我的 NSManagedObject 之前调用该 block 时,我的内存访问错误 "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

当我尝试存储 block 时:

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

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

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

最佳答案

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

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

关于ios - 是否可以在 NSManagedObject 中存储一个 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9826615/

相关文章:

ios - 如何向 PFUsers 发送 iOS 推送通知

iphone - 如何使用 Google Custom Search 在 objective c 中进行图片搜索

ios - 执行 block 数组的惯用方式

objective-c - Block_copy 是递归的吗?

Objective-C - block 和内存管理?

ios - NSInternalInconsistencyException?发送后布局约束仍需要更新

ios - 在自定义 UITableViewCell 中设置元素的角半径

cocoa - NSWindowController的窗口立即释放

objective-c - 在 ARC 下,使用运行时方法分配给对象类型的 ivar 是否合法/安全?

iphone - 将 ivar 设置为自定义子分类对象不起作用