2012-03-05 117 views
21

我有一些代碼,我想在我的MainViewController只運行一次。它應該在用戶每次啓動應用程序時運行,但只能在加載MainViewController後運行。使一些代碼只運行一次

我不想在-(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 2012-03-05 18:12:45

+0

哪些錯誤與運行' - (空)的applicationDidFinishLaunching:(UIApplication的*)application'或你的代碼?或者,如果你不ALLOC你MainViewCOntroller,它會被運行一次,反正 – Seega 2012-03-05 18:13:32

+1

一旦每_activation_(即,一旦在發射時再從後臺返回),或每一次它被加載到內存中? – 2012-03-05 18:14:47

回答

72

您可以使用dispatch_once

Objective-C的

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") 
} 
+2

+1; GCD對於此任務來說是一個更清潔的選擇,而不是在您的班級中維護BOOL狀態 – 2012-03-05 19:01:47

+23

請注意,這是每個應用程序加載到內存中的一次。該代碼將不會再次爲該類的另一個實例(最近這個位置)運行,也不會在應用程序從暫停狀態返回到前臺時再次運行。 – 2012-03-05 19:21:18

+0

很棒的回答。這感覺比我最初的想法更優雅。我學到了一些東西。謝謝! – 2012-03-05 19:48:06

7

我沒有看到該代碼的任何問題。我喜歡使用BOOL(如你所做的那樣),然後分配YES/NO或TRUE/FALSE,以便代碼讀得更好。我將在didFinishLaunching中將first賦給TRUE,並在代碼執行後將其設置爲FALSE。在我的代碼,這些類型的條件句通常是這樣的:

@synthesize firstRun; 

-(void)viewDidLoad { 
    [super viewDidLoad]; 
    if (firstRun) { 
     // code to run only once goes here 
     firstRun = FALSE; 
    } 
} 
+0

建議Grand Central Dispatch的另一個答案可以說是更好的方法。另一方面,考慮到這是一個「基本」問題,作爲BSD級別的技術,它具有相當陡峭的學習曲線。如果你想要做你所要求的,那麼這段代碼比你的原始代碼稍微乾淨 - 如果你想嘗試更高級的任務管理方法,GCD非常強大。 – Dylan 2012-03-05 19:19:38

-2

隨着Swift2.0時,Xcode 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

爲Swift2.2時,Xcode 7.3:

static var token: dispatch_once_t = 0 

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

當心 「YourClassName.token