5

可能であれば、コアデータNSManagedObjectの内部にブロックを保持したい。私はNSManagedObjectから継承したクラスを持っています。 このクラスには、いくつかの非同期呼び出しを満たすブロックがあります。ブロックをTransformableおよびTransient属性として格納しようとしました。ロード前にNSManagedObjectブロックを呼び出そうとすると、不正なメモリアクセスが発生します"EXC_BAD_ACCESS"NSManagedObjectの内部にブロックを格納することはできますか?

私は変形フラグをチェックしない場合、私はこのような例外があります。

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

は、私は、iOSに新たなんです。私は、ARCが有効になっているiOS 5 SDKの下で働いています。これは私のコードからの抜粋です:私はブロックを呼び出すと、エラーが発生したときに最後に

[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

にあなたを私がブロックを保存しようとした

#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 

ブロックを変換可能な型として格納することはできません。 Apple documentationによれば、変換可能オブジェクトはNSDataに変換可能でなければならない。ブロックは、コンパイルされたコードへのコンパイラの参照であり、移動可能なデータではないため、NSDataに変換することはできません。

ブロックは匿名メソッドのようなものです。異なるパラメータで毎回何度も呼び出すことができます。だから、一度ブロックを保存してから非同期呼び出しごとに何度も呼び出すのを止めることはありません。多くのブロックが必要と思われる場合は、各ブロックの呼び出しに渡す必要のあるデータを格納するだけです。

関連する問題