2012-02-12 12 views
36

मैं अभी एक ऐप विकसित कर रहा हूं जो एक JSON API से संसाधन प्राप्त करता है।आईओएस ऐप में स्थिरांक स्टोर करने के लिए सबसे अच्छी जगह कहां है?

संसाधनों के सभी एक ही आधार URL है:

http://api.mysite.com/resources.json 
http://api.mysite.com/other_resources.json 

मैं http://api.mysite.com/ स्ट्रिंग स्टोर करने के लिए तो यह मेरी नियंत्रकों और मॉडल के सभी के लिए उपलब्ध है, कुछ दोहराव को हटाने जब संसाधन यूआरएल लिख चाहते हैं।

ऐसा करने के लिए सबसे अच्छी जगह कहां है? -prefix.pch फ़ाइल?

किसी भी सलाह की सराहना की

उत्तर

64

मैं एक महत्वपूर्ण इसके अलावा के साथ एलेक्स Coplan के जवाब के साथ सहमत हैं।

"Constants.h" नामक फ़ाइल में (या/ई आप चाहते हैं डब्ल्यू) अपने सभी स्थिरांक रखो

संपादित करें:

  • जब मैं तीन साल पहले इस सवाल का जवाब, मैं पर था #define बैंडवैगन, एक संशोधन के लिए नीचे की जाँच करें।

Constants.h

#define kFilterDate @"date" 
#define kFilterRadius @"radius" 
#define kFilterSort @"sort" 

//Global Strings 
#define kDividingString @"/" 

//Strings 
#define kTour @"Tour" 
#define kToursKey @"tours" 

लेकिन इसके बजाय आप इसकी आवश्यकता है किसी भी फाइल में आयात करने की, यह आपके उपसर्ग फ़ाइल में आयात ताकि आपके हेडर के सभी यह स्वचालित रूप से आयात अपनी परियोजना भर में।

Project_Prefix.pch

// 
// Prefix header for all source files of the project 
// 

#ifdef __OBJC__ 
    #import <Foundation/Foundation.h> 
    #import <UIKit/UIKit.h> 
    #import "Constants.h" 
#endif 

संशोधन

सभी हालांकि सभी पिछले जानकारी अभी भी काम करेगा, वहाँ कुछ बातें हम थोड़ा और अधिक हमारे स्थिरांक के बारे में सुरक्षित रहने के लिए कर सकते हैं।

स्थिरांक चर

//Filters 
FOUNDATION_EXPORT NSString *const kFilterDate; 
FOUNDATION_EXPORT NSString *const kFilterRadius; 
FOUNDATION_EXPORT NSString *const kFilterSort; 

//Global Strings 
FOUNDATION_EXPORT NSString *const kDividingString; 

//Strings 
FOUNDATION_EXPORT NSString *const kTour; 
FOUNDATION_EXPORT NSString *const kToursKey; 

और में का उपयोग कर अपने Constants.h फ़ाइल Constants.m

//Filters 
NSString *const kFilterDate = @"date"; 
NSString *const kFilterRadius = @"radius"; 
NSString *const kFilterSort = @"sort"; 

//Global Strings 
NSString *const kDividingString = @"/"; 

//Strings 
NSString *const kTour = @"Tour"; 
NSString *const kToursKey = @"tours"; 

यह अभी भी ऊपर की तरह अपने उपसर्ग फ़ाइल में आयात किया जा सकता है में अपने स्थिरांक बनाएं, लेकिन केवल स्थिरांक है कि वास्तव में कर रहे हैं का उपयोग करें ऐसा करने के लिए फ़ाइल में वैश्विक। कई जगहों पर अक्सर उपयोग किया जाता है। इस फ़ाइल में आपके सभी स्थिरांक को डंप करने से आपका कोड होगा जो किसी भी स्थिरांक को स्थिरांक फ़ाइल के साथ जोड़ता है। इस प्रकार, यदि आप कोड का पुन: उपयोग करने का प्रयास करते हैं, तो स्थिरांक फ़ाइल को इसके साथ आना होगा।यह हमेशा जरूरी नहीं है, और कई बार इरादा है (जो ठीक है), लेकिन सीमित निर्भरता हमेशा एक अच्छा विचार है।

संशोधन के बारे में कुछ बातें:

  • FOUNDATION_EXPORT बनाम extern। पहला सी और सी ++ के लिए अलग संकलित करता है। इसका मूल रूप से extern है, लेकिन सी ++ में "सी" ध्वज जोड़ देगा।
  • consts बनाम definesconsts प्रकार सुरक्षित और सम्मान के दायरे हैं। defines सटीक विपरीत हैं।
+0

मुझे वैश्विक स्थिरांक के लिए '.h .m' का उपयोग करने से नफरत है। प्रत्येक वैरिएबल नाम लिखने के लिए TWICE एक दर्द है! – Hlung

+3

स्वच्छ, सुसंगत, पठनीय कोड होने से आपके दर्द से दोगुनी गुना 10 गुना अधिक है। – ColdLogic

+0

निम्नलिखित मामले के लिए मुझे क्या करना चाहिए? मुझे त्रुटि है "प्रारंभिक तत्व USER_LIST_URL के लिए समय स्थिरता संकलित नहीं करता है" NSString *const SERVER_URL = @"http://www.google.com"; NSString *const USER_LIST_URL = [NSString stringWithFormat:@"%@/xml/index.cfm",SERVER_URL];

4

मैं एक सिंगलटन बनाने या AppDelegate का उपयोग करें और वहाँ स्थिरांक जाते थे।

+0

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

+0

@WillPragnell हेडर फ़ाइल कैसे सिंगलटन की तुलना में यूनिट परीक्षण को आसान बनाती है? सामान्य सिंगलेट्स यूनिट परीक्षण को कठिन बनाते हैं, लेकिन ऐसा लगता है कि सिंगलटन चमकता है। – Jackson

11

मैं सिर्फ एक फ़ाइल निम्नलिखित की तरह कुछ के साथ Globals.h बनाएं जिसका नाम:

#define kBaseURL @"http://api.mysite.com/" 

तब उपयोग करने के लिए:

#import "Globals.h" // at the top 

NSString *url = [NSString stringWithFormat:@"%@resources.json",kBaseURL]; 
+0

मुझे लगता है कि यह जाने का सबसे अच्छा तरीका है। –

4

हां, एक वैश्विक शीर्षलेख एक आदर्श समाधान होगा। मैं एक सिंगलटन पैटर्न तक नहीं जाऊंगा जब तक कि आपके डेटा स्टोर को प्रबंधित करने जैसी अन्य चीज़ों के लिए इसका उपयोग करने की योजना न हो। ग्लोबल्स के लिए एक सिंगलटन कुछ हद तक अधिक है।

48

व्यक्तिगत रूप से मैं परिभाषित करने के बजाय वास्तविक स्थिर चर का उपयोग करना पसंद करता हूं।

एक MyConstants.m फ़ाइल में मेरे पास है:

NSString *const kXYMySiteBaseURL = @"http://api.mysite.com/"; 
NSString *const kXYSomeOtherURL = @"http://www.google.com/"; 

जहां XY मेरे नाम के पहले अक्षर या कुछ अन्य "अद्वितीय" उपसर्ग है अन्य स्थिरांक के साथ टकराव से बचने के लिए।

तो मैं इस तरह की एक MyConstants.h फ़ाइल है: पर कितने फ़ाइलों इन स्थिरांक का उपयोग करने की जरूरत है निर्भर करता है

extern NSString *const kXYMySitBaseURL; 
extern NSString *const kXYSomeOtherURL; 

, मैं इसे शामिल हो सकता है में ColdFusion तरह precompiled शीर्ष लेख अपने जवाब में पता चलता है।

इस प्रकार ऐप्पल अधिकांश कोर ढांचे में अपने स्थिरांक को परिभाषित करता है।

+2

मुझे पता है कि यह शायद एक नगण्य अंतर है - लेकिन एक बार निरंतर परिभाषित करने की स्मृति पर क्या प्रभाव पड़ता है (जो आपके ऐप की अवधि के लिए रहता है) वीएस परिभाषित करना मैक्रोज़ का उपयोग कर उदाहरण/स्थानीय चर का उपयोग किया जाता है और फिर फ्लाई पर जीसीड किया जाता है? – bodacious

+0

जैसा कि आप यहां पढ़ सकते हैं https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingIvarsAndTypes.html, ऐप्पल आपको #define मैक्रोज़ का उपयोग न करने के लिए प्रोत्साहित करता है। Thats मैं पिछले एक – voghDev

+0

की तुलना में यह जवाब क्यों पसंद करता हूं यह स्मृति की थोड़ी सी बचत है। इक्वल जैसी चीज़ों का लाभ भी है: या IsqualToString तारों की तुलना करने से भी परेशान नहीं होगा क्योंकि वे एक ही सूचक हैं। – gnasher729

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

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