2012-03-27 17 views
6

पृष्ठभूमि के साथ RestKit में अस्थायी वस्तुओं के लिए सर्वोत्तम अभ्यास पृष्ठभूमि: मेरे पास एक प्रबंधित ऑब्जेक्ट, कार है। मेरे पास स्थानीयहोस्ट/कार/खोज पर बैठे एक विश्वसनीय खोज एपीआई है। लौटाए गए परिणाम सर्वर की ओर से कार ऑब्जेक्ट्स हैं, लेकिन मैं केवल उस उपयोगकर्ता को सहेजना चाहता हूं जिसे उपयोगकर्ता चुनता है। बाकी कारें जिन्हें मैं खोज से बाहर टैप करते समय त्यागना चाहता हूं।कोर डेटा

पहले तो मुझे सभी की तरह था:

@interface Car : NSManagedObject //<--- managed object 

    @property (nonatomic, strong) NSNumber* year; 
    @property (nonatomic, strong) NSString* make; 
    @property (nonatomic, strong) NSString* model; 

@end 

@interface TransientCar : NSObject //<--- regular NSObject! 

    @property (nonatomic, strong) NSNumber* year; 
    @property (nonatomic, strong) NSString* make; 
    @property (nonatomic, strong) NSString* model; 

@end 

मैं REST API खोज मानचित्रण किया गया था खोज परिणाम प्रदर्शित करना नहीं, बल्कि उन्हें संदर्भ के लिए बचत के प्रयोजनों के लिए TransientCar वस्तुओं में परिणाम JSON। डिफ़ॉल्ट रूप से, यदि आप किसी प्रबंधित ऑब्जेक्ट को मैप करते हैं, तो RestKit ऑब्जेक्ट बनाने के लिए अपनी ऑब्जेक्ट सुविधा फैक्ट्री को कॉल करेगा और इसे वर्तमान संदर्भ में डालेंगे (साझा मैनेजर के ऑब्जेक्ट स्टोर के संदर्भ में हार्ड-कोडित, बीटीडब्ल्यू!)

यह असंभव लग रहा था। तो अब मैं सिर्फ NSMutableDictionary उपयोग कर रहा हूँ जब तक उपयोगकर्ता एक विस्तार दृश्य में टैप करता है और के लिए एक असली प्रबंधित वस्तु बचत के लायक कुछ करता है खोज परिणाम डेटा रखने के लिए:

RKObjectMapping* tempCarMapping = [RKObjectMapping mappingForClass:[NSMutableDictionary class]]; 
[tempCarMapping mapKeyPathsToAttributes: 
@"year", @"year", 
@"make", @"make", 
@"model", @"model", 
nil]; 

यह एक अच्छा अभ्यास है? एनएसएमयूटेबल डिक्शनरी का अस्थायी प्रतिनिधित्व के रूप में उपयोग करते हुए उपयोगकर्ता तब तक ऐसा कुछ करता है जो संदर्भ में एक नई वस्तु डालने की गारंटी देता है? मैं डेटा का प्रतिनिधित्व करने के लिए मूल प्रबंधित ऑब्जेक्ट सबक्लास का उपयोग करने का एक प्रशंसक था, लेकिन किसी भी तरह इसे "नहीं रखना" या कुछ के रूप में ध्वजांकित करने में सक्षम था, लेकिन हर बार जब मैं ऐसा करता हूं तो मुझे लगता है कि मैं ढांचे से लड़ रहा हूं (और दौड़ की स्थिति)। मैं भी एक नया RKObjectManager बनाने और सिर्फ बाद में इसके पूरे संदर्भ को साफ़ करके एक खरोंच/throwaway संदर्भ उपयोग करने की कोशिश, लेकिन RestKit के ActiveRecord श्रेणी के + managedObjectContext विधि वापस जाने के लिए hardcoded है:

[[[RKObjectManager sharedManager] objectStore] managedObjectContext]; 

उस तरह का कभी उपयोग करने की संभावना scuttles अस्थायी/कचरा डेटा के लिए एक खरोंच संदर्भ।

उत्तर

3

सबसे पहले, मैंने मॉडल की दो प्रतियां रखने की आपकी विधि का उपयोग करके अतीत में ऐसा किया है, जो कोर डेटा के लिए है और जो क्षणिक है (केवल एक एनएसओब्जेक्ट)। यह मेरे लिए किसी भी समस्या के बिना काम किया।

आपके अन्य प्रयासों के लिए, मुझे नहीं लगता कि पुस्तकालय आपके हाथ को जितना सोचता है उतना ही मजबूर करता है। RKManagedObjectStore और NSManagedObject+ActiveRecord के लिए एपीआई देखें। विशेष रूप से, RKManagedObjectStore में managedObjectContext संपत्ति है, एक विधि - (NSManagedObjectContext*)newManagedObjectContext और परिवर्तन विलय के लिए कई विधियां हैं।

आप सही हैं कि [NSManagedObject managedObjectContext] हमेशा साझा प्रबंधक का संदर्भ देता है - लेकिन यह समझ में आता है, यह एक क्लास विधि है। अन्यथा वर्ग कैसे पता चलेगा कि कौन सा संदर्भ लौटाएगा? लेकिन यह मंथन है क्योंकि नए संदर्भ बनाने और उन्हें एक्सेस करने के कई अन्य तरीके हैं। या पूरी तरह से छेड़छाड़ कर, आप केवल अपने अस्थायी संदर्भ का संदर्भ रख सकते हैं और इसका सीधे उपयोग कर सकते हैं।

यह आपको कुछ विकल्प देता है: एकाधिक ऑब्जेक्ट प्रबंधक हैं, एक ऑब्जेक्ट मैनेजर हैं, लेकिन इससे एक अस्थायी संदर्भ बनाएं और केवल वही ऑब्जेक्ट रखें जो आप चाहते हैं, प्रबंधित ऑब्जेक्ट के आधार पर एक क्षणिक ऑब्जेक्ट बनाएं।

एनएसएमयूटेबल डिक्शनरी विकल्प अन्य तरीकों के रूप में लचीला प्रतीत नहीं होता है, लेकिन मैं यह नहीं कहूंगा कि यह "खराब अभ्यास" है।

+0

एनएसओब्जेक्ट से प्राप्त होने वाली एक क्षणिक मॉडल क्लास ठीक है, लेकिन मेरी सबसे बड़ी चिंता एनएसएमएनेज्ड ऑब्जेक्ट संस्करण के साथ क्षणिक मॉडल को अद्यतित रख रही है। यह तकनीकी एक की तुलना में एक कोड रखरखाव चिंता का अधिक है। यह संपादक का अच्छा होगा> एनएसएमएनेज्ड ऑब्जेक्ट सबक्लास उत्पन्न करें "प्रतिबिंबित NSObject subclass के साथ" के लिए एक चेकबॉक्स था। –

+0

निश्चित रूप से - और यदि आपका मॉडल किसी भी आवृत्ति के साथ बदल जाएगा, तो मैंने उल्लिखित अन्य तरीकों में से एक अच्छा विकल्प होगा। –

2

आप भी इस सवाल का जवाब देख सकते हैं: Better Approach for Creating Temp Object for Core Data with Restkit

यह क्षणिक वस्तु समस्या इवान Cordell, जो RestKit लिए एक बड़ा योगदान है द्वारा जवाब में बताया गया से बचने जाएगा।

5

दुर्भाग्यवश, मेरे पास यह जवाब देने के लिए अभी तक पर्याप्त स्टैक ओवरफ्लो प्रतिष्ठा नहीं है, जहां यह संबंधित है (अन्य उत्तरों के लिए टिप्पणियों के रूप में), लेकिन मैं कुछ बिंदु जोड़ना चाहता था।

मुझे विश्वास है कि इवान कॉर्डेल का जवाब त्रुटिपूर्ण है। वर्तमान restkit संस्करण (0.10.x) आपको RKManagedObjectLoaders के उपयोग के लिए संदर्भ बनाने नहीं देता है, और RKObjectManagers स्टोर ले सकते हैं, लेकिन इसे RKManagedObjectStore टाइप करना होगा, जो स्पष्ट रूप से sqllite से जुड़ा हुआ है। Restkit (0.20) का dev संस्करण स्पष्ट रूप से उसमें आराम करता है, ताकि आप डेटा को इन-मेमोरी डेटाबेस में सहेज सकें। मैंने प्रदान किए गए संदर्भ का उपयोग करने के लिए RKManagedObjectStore विधियों को ओवरराइड करने का प्रयास किया था, लेकिन यह काम नहीं किया ... किसी भी दर पर, फिक्स गैर-तुच्छ दिखाई देता है।

दिया गया अन्य लिंक, Better Approach for Creating Temp Object for Core Data with Restkit, किसी ऑब्जेक्ट को पोस्ट करने और प्रतिक्रिया में उसी ऑब्जेक्ट को प्राप्त करने के साथ प्रतीत होता है। इस सवाल में उत्पन्न होने की तुलना में यह एक अलग समस्या है।

v.0.20.x जारी होने तक, जो जल्द ही जल्द ही होगा, ऐसा लगता है कि समांतर वर्ग पदानुक्रम ही एकमात्र विकल्प है। अगर मैं गलत हूं, तो मैं इस बिंदु पर सुधार का स्वागत करता हूं!

+0

RestKit अक्सर बदलता है और यह पता लगाने का सबसे अच्छा तरीका दस्तावेज़ों की जांच करना है। हालांकि, 1.0 के बाद इसे ज्यादा नहीं बदला जाना चाहिए। अभी किसी भी निरंतर स्टोर समन्वयक के साथ RKManagedObjectStore बनाने और इच्छानुसार संदर्भ जोड़ने/निकालने का एक तरीका है। –