2012-03-05 22 views
21

मेरे पास कुछ कोड है जो मैं अपने मेनव्यू कंट्रोलर में केवल एक बार चलाने के लिए चाहता हूं। जब भी उपयोगकर्ता ऐप शुरू करता है तो इसे चलाना चाहिए, लेकिन केवल मेनव्यू कंट्रोलर लोड होने के बाद ही इसे चलाना चाहिए।कुछ कोड बनाना केवल एक बार चलाएं

मैं इसे -(void)applicationDidFinishLaunching:(UIApplication *)application में चलाने के लिए नहीं चाहता हूं।

MainViewController.h

@interface IpadMainViewController : UIViewController <UISplitViewControllerDelegate> { 
    BOOL hasRun; 
} 

@property (nonatomic, assign) BOOL hasRun; 

MainViewController.m

@synthesize hasRun; 

-(void)viewDidLoad { 
    [super viewDidLoad]; 
    if (hasRun == 0) { 
     // Do some stuff 
     hasRun = 1; 
    } 
} 

कोई भी विचार:

यहाँ विचार मैं था है?

+0

आप अपने कोड की कोशिश की? – Jim

+0

'- (शून्य) अनुप्रयोग चलाने के साथ क्या गलत हैडिफफिशिश लॉन्चिंग: (यूआईएप्लिकेशंस *) एप्लिकेशन' या आपका कोड? या यदि आप अपना मेनव्यूकंट्रोलर आवंटित नहीं करते हैं, तो यह किसी भी तरह से चलाया जाएगा – Seega

+1

प्रति बार _activation_ (यानी, लॉन्च होने पर और फिर पृष्ठभूमि से वापस आने पर), या प्रति बार एक बार यह स्मृति में लोड हो जाता है? –

उत्तर

72

आप dispatch_once उपयोग कर सकते हैं , एक्सकोड 7.0

var token: dispatch_once_t = 0 

override func viewDidLoad() { 
    super. viewDidLoad() 
    dispatch_once(&token) { 
     println("This is printed only on the first call to test()") 
    } 
    println("This is printed for each call to test()") 
} 
+2

+1; जीसीडी आपकी कक्षा –

+23

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

+0

ग्रेट उत्तर। यह मेरे मूल विचार से ज्यादा सुरुचिपूर्ण लगता है। मैंने कुछ सीखा है। धन्यवाद! –

7

मुझे उस कोड के साथ कोई समस्या नहीं दिख रही है। मुझे एक बूल का उपयोग करना पसंद है (जैसा आपने किया था) और उसके बाद या तो YES/NO या TRUE/FALSE असाइन करना ताकि कोड अधिक अच्छी तरह से पढ़ सके। मैं पहली बार ट्रूश लॉन्चिंग करने के लिए सत्य को सौंप दूंगा, और कोड निष्पादित करने के बाद इसे गलत सेट कर दूंगा। मेरी कोड में सशर्त, के इन प्रकार आमतौर पर इस तरह दिखेगा:

ऑब्जेक्टिव-सी

static dispatch_once_t once; 
dispatch_once(&once,^{ 
    NSLog(@"Do it once"); 
}); 

स्विफ्ट

static var token: dispatch_once_t = 0 

dispatch_once(&token) { 
    NSLog("Do it once") 
} 
+0

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

-2

Swift2.0 के साथ:

@synthesize firstRun; 

-(void)viewDidLoad { 
    [super viewDidLoad]; 
    if (firstRun) { 
     // code to run only once goes here 
     firstRun = FALSE; 
    } 
} 
-2
Swift2.2 के लिए

, Xcode 7.3:

static var token: dispatch_once_t = 0 

dispatch_once(&YourClassName.token) { 
    NSLog("Do it once") 
} 

से सावधान रहें "YourClassName.token"

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