2012-04-04 5 views
5

मैं एक ऐसा iOS ऐप्लिकेशन है (जब आवेदन आरंभ नहीं हो जाता) एक बार कहे जाने के कार्य करते हैं। आवेदन में 2 अलग-अलग विचार हैं: मुख्य और सेटिंग्स। वास्तव में, एप्लिकेशन को मुख्य दृश्य में उपयोग किए जाने से पहले कुछ पुस्तकालय और ढांचे को लोड और प्रारंभ करने की आवश्यकता होती है।आईओएस

जब मैं viewDidLoad विधि में इस आरंभीकरण शब्दों में कहें, यह ठीक काम करता है। लेकिन जब सेटिंग्स पर जाएं और मुख्य दृश्य पर वापस आएं, तो प्रारंभिकरण फिर से शुरू होता है, जो मैं नहीं चाहता हूं, और एप्लिकेशन को स्मृति समस्या में परिणाम मिलता है।

मैं एक विधि है कि एक बार जब आवेदन शुरू कर दिया है कहा जाता है की जरूरत है। कोई उपाय?

संपादित करें: मैं टैब वाले दृश्य करने लगे। यह एक बार विचार लोड करता है। यह एक और समाधान है।

उत्तर

7

उपयोग इस एक:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

यह अपने AppDelegate कक्षा में होना चाहिए।

आशा है कि यह अपनी टिप्पणी है कि आप application:didFinishLaunching में इस कोड डाल करने के लिए नहीं करना चाहते हैं में से एक में

+0

लेकिन अपने आवेदन त्वरित रूप से प्रारंभ करने के लिए आप r से बचना चाहिए: उस वर्ग के लिए भेजा जाता 'DidFinishlaunchingWithOptions' – iDroid

+1

अंदर unning बड़ा धागे मैं @chiLLer से सहमत हैं। मुझे ViewController के अंदर कॉल करने के लिए एक विधि की आवश्यकता है। – mert

+1

आपका मतलब है कि आपके एप्लिकेशन प्रारंभिक लॉन्च केवल आपको चीजों को सही तरीके से शुरू करना होगा। यदि आप इसे 'viewDidLoad' अंदर कर स्पष्ट रूप से यह हर बार जब आप इसे लोड करने का आह्वान किया जाएगा ', यहाँ आप सभी की जरूरत को याद है कि आप इसे alresdy नहीं खोला है या है। इसके लिए आप राज्य को याद रखने के लिए 'एपडिलेगेट' में प्लिस्ट या NSUserDefault कुंजी मान जोड़ी या यहां तक ​​कि एक वैश्विक चर बनाए रख सकते हैं .... – iDroid

28

आप राज्य में मदद करता है और आप viewDidLoad में रखने के लिए चाहते हैं। आप अपने कोड को चलाने के लिए इस स्निपेट का उपयोग कर सकते हैं केवल पहली बार है शुरू हो जाती है:

static dispatch_once_t onceToken; 
dispatch_once(&onceToken, ^{ 
    // code here 
}); 

भीतरी ब्लॉक केवल एक बार निष्पादित किया जाएगा। यदि दृश्य फिर से लोड किया गया है, तो ब्लॉक को नहीं कहा जाता है। ध्यान दें कि यह आप संपादक में dispatch_once टाइप करने के लिए शुरू करने से उपयोग कर सकते हैं जिसके लिए एक Xcode कोड स्निपेट है कि वहाँ: अपने AppDelegate में

enter image description here

enter image description here

+0

वास्तव में महान answere @ माइक वेलर – iDroid

+0

थ्रेड-सुरक्षित उदाहरण के लिए धन्यवाद – Sergei

0

, वस्तुओं की गारंटी में से एक केवल एक ही है करने के लिए उदाहरण (सिंगलटन) पूरे एप्लिकेशन में, आप एक उदाहरण चर/संपत्ति की घोषणा कर सकते हैं: अपने UIViewController की viewDidLoad में BOOL initialized;

और फिर, आप चर्चा अगर यह कोड शुरू किया गया है तो eck; यदि नहीं, तो कोड चलाने के लिए और सही करने के लिए चर सेट:

if (!initialized) { 
    // Code goes here 
    initialized = true; 
} 
2

तुम भी उपयोग कर सकते हैं

+ [NSObject initialize] 

उस नाम के एक वर्ग विधि को परिभाषित करें, और यह एक बार किसी अन्य संदेशों से पहले चलाया जाएगा

+ (void)initialize { 
    // Put one-time initialization code here. 
} 

https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html#//apple_ref/occ/clm/NSObject/initialize