【问题标题】:Is it possible to store a block inside of a NSManagedObject?是否可以在 NSManagedObject 中存储块?
【发布时间】:2012-03-22 16:35:46
【问题描述】:

如果可能的话,我想在核心数据 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];

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多