2012-02-13 41 views
2

私はurl文字列のデータを解析してラベルを設定するこの関数を持っています。ビューの呼び出し後に関数を呼び出す

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self parseAndSetLabels]; 
} 

problenは、あなたが悪いの接続を持っている場合、それはしばらく時間がかかることができ、それがアプリのフリーズが好き、それはビューをアニメーション化する前に、それは実際にparseAndSetLabels機能を行う見えるということです。

どのように私はviewLoadを作ることができますし、その後、私の機能を実行する?代わりに(この順序でのように)

-(void)main 
{ 
    [self viewDidLoad] 
    [self parseAndSetLabels]; 
} 
+1

あなたの二つの文の間に違いはありません。あなたがしなければならないのは、parseAndSetLabelsを呼び出し、それが完了したときにメッセージをポストするスレッドを開始することです。 – KevinDTimm

+0

あなたの場合は、viewDidLoadのビューにいくつかの初期データ(最後のセッションからキャッシュされている可能性があります)を設定するだけで、別のスレッドに移動するparseAndSetLabelsを開始する必要があります。この方法でGUIはフリーズしません。編集:申し訳ありませんがほぼ重複するコメント、私はそれを入力する8分かかったと思う:) –

答えて

4

Nickolay O.によると、NSURLConnectionはデリゲートメソッドと非同期で使用するか、viewDidAppear:メソッドでparseAndSetLabelsメソッドを呼び出すことができます。
この最後のメソッドの内部で、あなたの電話をかける、それはビューが表示されるたびに呼び出されますが、あなたはこれをしたくない場合は、あなたがこの例のように、一度だけこのメソッドを呼び出すために、単純なブール条件を使用することができます。

YourController.h 

@property (nonatomic) BOOL condition; 

YourController.m 

-(void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.condition = YES; 
} 
-(void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    if (self.condition) 
    { 
     [self parseAndSetLabels]; 
     self.condition = NO; 
    } 
} 

ただし、お客様のケースでは、NSURLConnectionとその代理人が最適なソリューションです。

+0

これは私の問題を解決し、viewdidappearを見つけられませんでした。 – captencrunch

0

使用非同期NSURLConnection(または二次スレッド)。

1

parseAndSetLabelsの内容を見ることなくあまりにも具体的であることは難しいですが、一般的にはviewDidLoadコードでネットワーク操作を同期して行うべきではありません。一時的なプレースホルダにラベルを設定し、非同期操作の完了時に実行されるブロックを取る非同期呼び出しを開始する必要があります。その非同期ブロック内からラベルの実際の値を設定する必要があります。

0

代わりに、View Controllerを起動する前にデータをダウンロードして解析することもできます。したがって、解析されたデータでviewDidLoadメソッドのラベルを設定するだけです。 また、アプリケーションがconnectionDidfinishLoading(Asyncモードを使用している場合)で信号を受信すると、ViewControllerを開始することもできます。

あなたが話しているビューコントローラがルートビューコントローラの場合、 は、Webサービスまたは非同期呼び出しへの同期呼び出しを使用していますか。あなたからの入力が助けになります。

1

あなたが遅延して、パフォーマンスを希望した場合: - 彼らは同じことを実行します

[self performSelector:@selector(something) withObject:nil afterDelay:0.0f]; 
関連する問題