gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 04:44:40 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com