2011-08-25 23 views
8

में ऑब्जेक्ट मैपिंग्स रखने के लिए सबसे अच्छी जगह कहां है, मैं एक प्रोजेक्ट के लिए रेस्टकिट का उपयोग कर रहा हूं और मैंने देखा कि क्लास में अब कोई तरीका नहीं है कि आप सभी मैपिंग्स (elementToPropertyMappings) में नियंत्रित कर सकते हैं, इसलिए मैंने सोचा कि कहां नया कोड डालने के लिए सबसे अच्छी जगह थी, वर्तमान में मैं इसे अपने व्यू कंट्रोलर में कर रहा हूं, लेकिन मैं अपने कोड के अन्य क्षेत्रों में एक ही मैपिंग का उपयोग करूँगा, इसलिए इसे रखने के लिए एक और अधिक कुशल जगह है:RestKit

कोड मैं की बात कर रहा हूं:

RKObjectMapping* userMapping = [RKObjectMapping mappingForClass:[User class]]; 
[userMapping mapKeyPath:@"id" toAttribute:@"identifier"]; 
[userMapping mapKeyPath:@"forename" toAttribute:@"forename"]; 
[userMapping mapKeyPath:@"surname" toAttribute:@"surname"]; 
[userMapping mapKeyPath:@"email" toAttribute:@"email"]; 
[userMapping mapKeyPath:@"twitter_username" toAttribute:@"twitterUsername"]; 
[userMapping mapKeyPath:@"created" toAttribute:@"created"]; 
[userMapping mapKeyPath:@"use_gravatar" toAttribute:@"useGravatar"]; 
[userMapping mapKeyPath:@"avatar_url" toAttribute:@"avatarURL"]; 
[userMapping mapKeyPath:@"gender" toAttribute:@"gender"]; 
[[RKObjectManager sharedManager].mappingProvider setMapping:userMapping forKeyPath:@"user"]; 

यह है कि अगर यह उपयोगकर्ता वर्ग पर एक विधि है कि मैं तो सेटअप इन नक्शा करने के लिए कॉल कर सकते हैं में हो सकता है बहुत अच्छा होगा पिंग्स आदि

कई धन्यवाद

उत्तर

9

आपके मैपिंग व्यवस्थित करने के लिए कुछ अच्छे तरीके वर्तमान में सिफारिश कर रहे हैं:

  1. अपने अनुप्रयोग प्रतिनिधि में अपने मैपिंग के सभी रखो और ऐप्स में प्रारंभ में कॉन्फ़िगर करें। यह उन्हें नियंत्रकों से बाहर रखता है और उपयोगी होता है यदि आपके पास मैपिंग की एक छोटी संख्या है।
  2. आरकेओब्जेक्टमैपिंगप्रोवाइडर को उप-वर्गीकृत करें और अपने सबक्लास के इनिट विधि में अपने सभी मैपिंग बनाएं, फिर ऑब्जेक्ट मैनेजर को अपने मैपिंग प्रदाता इंस्टेंस को तुरंत चालू करें और असाइन करें।
  3. 'defineMappings' जैसी विधि के साथ RKObjectMappingProvider में एक श्रेणी जोड़ें। फिर अपने ऐप प्रतिनिधि में हेडर आयात करें और RestKit प्रारंभ करने के बाद इसे [मैपिंगप्रोवाइडर परिभाषित मैपिंग] के माध्यम से आमंत्रित करें।

कक्षा विधि पर मैपिंग को परिभाषित करने में समस्या यह है कि जब आपके संबंध होते हैं, तो आप सर्कुलर निर्भरताओं के साथ हवादार हो सकते हैं क्योंकि उदाहरणों को स्टोर करने के लिए कोई इवर उपलब्ध नहीं है। हम इस समस्या को कम करने में मदद के लिए ब्लॉक के साथ कुछ करने में सक्षम हो सकते हैं, लेकिन ऐसा कोई काम अभी तक नहीं किया गया है।

+1

अतीत में मैंने अपने ऐप प्रतिनिधि से सेटअप को स्थानांतरित करने के लिए अभी एक RestKitManager और मैपिंग मैनेजर ऑब्जेक्ट बनाया है। मैपिंग मैनेजर मैपिंग के प्रत्येक मैपिंग का संदर्भ रखता है और यह मैपिंग शुरू करने और सेटअप करने के लिए RestKitManager में एक सिंगल पॉइंट ऑफ एंट्री प्रदान करता है, ताकि न तो RestKitManager, और न ही ऐपडिलेगेट को इसके बारे में कोई जानकारी जाननी चाहिए शामिल इकाइयों की संख्या। * कैसे * मानचित्रण प्रदाता subclassing एक और अधिक सुरुचिपूर्ण दृष्टिकोण की तरह लगता है। मैंने पहले ऐसा नहीं माना था। –

+0

इस प्रश्न को हाइजैक नहीं करना चाहते हैं, मैंने यहां एक बहुत करीबी से संबंधित प्रश्न पूछा: http://stackoverflow.com/questions/7399095/where-to-put-object-mappings-in-restkit – Glenn

1

मैं आमतौर पर अपने ऐप प्रतिनिधि में एक निजी विधि बनाता हूं जिसे मैं ऐप सेटअप के दौरान कॉल करता हूं जो आरके ऑब्जेक्ट मैनेजर सेट करता है और फिर पूरे ऐप में उपयोग की जाने वाली सभी मैपिंग्स बनाता है। मेरा मानना ​​है कि रेस्टकिट नमूना परियोजनाएं इसी पैटर्न का उपयोग करती हैं, इसलिए निश्चित रूप से उनको संदर्भ के रूप में देखें।

3

मुझे लगता है कि डोमेन मॉडल केवल एक होना चाहिए जो मैपिंग के बारे में जानना चाहिए। यहाँ कैसे मैं कुछ फ़्लिकर json नक्शा है:

मैं मैपिंग फोन जब आपको उनकी आवश्यकता (AppDelegate में या जहां हो सकता है कभी आप चाहते हैं)

// Setup our object mappings 
RKObjectMapping *photoMapping = [Photo mapWithMapping:nil]; 
RKObjectMapping *photosMapping = [Photos mapWithMapping:photoMapping]; 

और यह मेरे डोमेन वस्तुओं में से एक है: इसमें मैपिंग करने वाले क्लासमेड शामिल हैं।

#import "Photos.h" 
@implementation Photos 

+ (RKObjectMapping*)mapWithMapping: (RKObjectMapping*)aMapping 
{ 
    RKObjectManager *objectManager = [RKObjectManager sharedManager]; 
    RKManagedObjectMapping *mapping = [RKManagedObjectMapping mappingForClass:[self class] inManagedObjectStore:objectManager.objectStore]; 

    [mapping mapKeyPathsToAttributes: 
     @"page", @"page", 
     @"pages", @"pages", 
     @"perpage", @"perpage", 
     @"stat", @"stat", 
     @"total", @"total", 
    nil]; 

    if (aMapping) { 
     [mapping mapRelationship:@"photo" withMapping:aMapping]; 
    } 

    return mapping; 
} 

@end