2012-03-05 31 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

"YourClassName.tokenを" 気をつけては、あなたのコードを試してみましたか? – Jim

+0

' - (void)applicationDidFinishLaunching:(UIApplication *)アプリケーション'またはあなたのコードを実行すると何が問題になりますか?または、MainViewCOntrollerを割り当てなかった場合は、とにかく1回だけ実行されます – Seega

+1

起動ごとに1回(つまり、起動時に1回、バックグラウンドから復帰するときに1回)、または時間ごとに1回メモリにロードされます。 –

答えて

72

あなたがdispatch_once使用することができます。Swift2.0で

の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状態を維持するよりも、このタスクのためのよりクリーンな選択です –

+23

これは、メモリにロードされているアプリケーションごとに一度です。このクラスの別のインスタンスが作成されたときにコードが再度実行されることはありません(このビットは最近使用されました)。また、アプリケーションが中断からフォアグラウンドに戻るときに再び実行されることはありません。 –

+0

素晴らしい答え。これは私の元の考えよりはるかにエレガントな感じです。私は何かを学んだ。ありがとう! –

7

私はこのコードに問題はありません。私はあなたがしたようにBOOLを使用して、YES/NOまたはTRUE/FALSEのどちらかを割り当てると、コードがよりうまく読みやすくなります。私はdidFinishLaunchingのfirstRunにTRUEを割り当て、コードの実行後はFALSEに設定します。私のコードでは条件文のこれらのタイプは通常、次のようになります。

@synthesize firstRun; 

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

グランドセントラルディスパッチをお勧めするもう一つの答えは、間違いなく良いアプローチです。一方、BSDレベルの技術として、これは "基本的な"質問であると考えて、かなり険しい学習曲線を持っています。あなたが尋ねたことをしたいのであれば、このコードはオリジナルよりもやや洗練されています.GCDは非常に強力です。 – Dylan

-2

を、Xcode 7.0

01 Swift2.2、Xcodeの7.3のための
-2

static var token: dispatch_once_t = 0 

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

関連する問題