5

यदि संभव हो तो मैं मूल डेटा NSManagedObject के अंदर एक ब्लॉक को जारी रखना चाहता हूं। मेरे पास NSManagedObject से विरासत कक्षा है। इस कक्षा में कुछ एसिंक्रोनस कॉल को संतुष्ट करने के लिए एक ब्लॉक है। मैंने ब्लॉक को ट्रांसफॉर्म करने योग्य और क्षणिक विशेषता के रूप में स्टोर करने का प्रयास किया। जब मैं अपने NSManagedObject लोड करने से पहले ब्लॉक को आज़माने का प्रयास करता हूं तो मेरे पास खराब स्मृति पहुंच "EXC_BAD_ACCESS" है।क्या एनएसएएनएजेडऑब्जेक्ट के अंदर एक ब्लॉक को स्टोर करना संभव है?

मैं बदला जाने वाला झंडा चेक नहीं करते हैं मैं एक अपवाद इस के समान है:

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

मैं आईओएस में नया हूँ। मैं एआरसी सक्षम के साथ आईओएस 5 एसडीके के तहत काम कर रहा हूँ। यह मेरा कोड से एक उद्धरण है:

#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 में परिवर्तनीय होना चाहिए। ब्लॉक को एनएसडीटा में परिवर्तित नहीं किया जा सकता है क्योंकि यह संकलित कोड के संकलक का संदर्भ है, न कि कुछ डेटा जिन्हें चारों ओर स्थानांतरित किया जा सकता है।

बस एक नोट, कि ब्लॉक एक अज्ञात विधि की तरह है। आप इसे कई बार एक अलग पैरामीटर के साथ कई बार कॉल कर सकते हैं। तो आपको ब्लॉक को एक बार स्टोर करने से रोकने और प्रत्येक एसिंक्रोनस कॉल में इसे कई बार कॉल करने से रोक नहीं रहा है। यदि आपको लगता है कि आपको कई ब्लॉकों की आवश्यकता है तो सबसे अधिक संभावना है कि आपको केवल उस डेटा को स्टोर करने की आवश्यकता है जिसे प्रत्येक ब्लॉक आमंत्रण में पारित किया जाना चाहिए।

संबंधित मुद्दे

 संबंधित मुद्दे