2012-05-10 14 views
0

私のアプリのある時点で、アプリケーションがサーバーからデータを取得する必要があるコードのリストを入れました。このプロセスがかなり時間がかかることがわかったので、画面が暗くなり、ラベルが中央に表示され、「今すぐサーバーからblablablaデータをロードしています」というメッセージが表示されます。コードの行間のデータが実行されなかった

問題は、サーバー(JSONデータ)私はJSON機能ここ

の間でそれを変更するコードを入れても、私のコードです

[self.viewReportProduksi getDataReport]; 
          [loadinglabel setText:@"Loading Chart Data from server . . ."]; 
          [self.viewReportProduksi getChartData]; 
          [loadinglabel setText:@"Loading Data Komisi from server . . ."]; 
          [self.viewKomisi getDataKomisi]; 
          [loadinglabel setText:@"Loading Bonus Data from server . . ."]; 
          [self.viewBonus getDataBonus]; 
          [loadinglabel setText:@"Loading Bonus Agen Data from server . . ."]; 
          [self.viewBonusAgen getDataBonusAgen]; 
          [loadinglabel setText:@"Loading Agent Reward Data from server . . ."]; 
          [self.viewAgenReward getDataRewardAgen]; 

「getXXXXXX」は、JSONが実行されるメソッドです。

これは、論理的に、これは進捗状況がどれだけ遠くにあるかをアプリに表示させるはずです。しかし、ラベルは "サーバーからのチャートデータの読み込み"に固執していて、それに応じてコードが変更されることはありません。

私は両方がメインスレッドは超多忙であるため、何の違い

おかげ

答えて

1

問題は、すべてのグラフィックスアップデートがメインスレッド上で起こるということです。あなたのコードブロック全体が完成するまで、何も変わりません。これは、バックグラウンドですべてのデータを読み込む必要がある場合です。柔軟性を最大限に高めるために、私はNSBlockOperationsの負荷を使用します。

まず、メインスレッドを実行してステータステキストを更新する方法が必要です。

-(void) updateStatusWithString: (NSString*) message 
{ 
    [loadingLabel setText: message]; 
    // might want to do other stuff e.g. if you have fully loaded the data 
} 

次に、あなたの方法を順番にすべてのデータをロードする代わりに、各フェーズのためNSBlockOperationを作成して、操作キューにそれを栓。

-(void) loadData 
{ 
    NSBlockOperation* block1 = [NSBlockOperation blockOperationWithBlocK: ^() 
    { 
     [self performSelectorOnMainThread: @selector(updateStatusWithString:) 
           withObject: @"Loading chart data from server" 
          waitUntilDone: NO]; 
     [self.viewReportProduksi getChartData]; 
    }]; 
    NSOperationQueu* queue = [[NSOperationQueue alloc] init]; 
    [queue addOperation: block1]; 

    NSBlockOperation* block2 = [NSBlockOperation blockOperationWithBlocK: ^() 
    { 
     [self performSelectorOnMainThread: @selector(updateStatusWithString:) 
           withObject: @"Loading Data Komisi from server" 
          waitUntilDone: NO]; 
     [self.viewKomisi getDataKomisi]; 
    }]; 
    [block2 addDependency: block1]; 
    [queue addOperation: block2]; 

    // etc for all the other blocks 
} 

各操作は前の操作に依存するため、次々と実行されますが、一部のバックグラウンドスレッドで実行されます。操作と操作のキューを使用すると、簡単に-addDependency:

  • 操作をキャンセルするためのメカニズムが組み込まれています使用して操作間の依存関係をモデル化することができる

    • ので、GCDを超える利点を有しています。ユーザーが途中でアプリを終了することを決定した場合、あなたは開始されていないキュー上のすべての操作がキャンセルされます

      [queue cancelAllOperations]; 
      

      を発行することができます。

  • +0

    答えの男の子のためにありがとうが、現在私はオフィスにある私のMacから離れている。私はこれをテストしてすぐにアップデートを知らせてくれるでしょう。その説明を+1してくれてありがとうございます。 –

    +0

    これは解決策です –

    1

    それは、あなたがメインスレッド上で、あなたのデータをロードしているためだんと示して、メインスレッドとdispatch_queueを使用して、両方でこれを試してみました表示を更新することはありません。

    データの読み込みを別のスレッドに移す必要があります。たとえば、更新情報を含むメインスレッドに通知を送信する必要があります。

    +0

    データ読み込みの間にラベルを変更せずに、dispatch_asyncを使用してデータを読み込もうとしました。 dispatch_asyncの –

    +1

    は、メインキューのラベルをロードしていますか? –

    +0

    いいえ、私はキューに追加しました。私は –

    0

    私はあなたがそのような何かsould思う:

    - (void)firstPart { 
        //This is main thread 
        [loadinglabel setText:@"Loading Chart Data from server . . ."]; 
        [NSThread detachNewThreadSelector:@selector(getChartData) toTarget:self.viewReportProduksi withObject:nil]; 
    } 
    
    - (void)getChartData { 
        //this is an extra thread 
        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
        //Your loading code 
        [self performSelectorOnMainThread:@selector(secondPart) withObject:self waitUntilDone:NO]; 
        [pool drain]; 
    } 
    - (void)secondPart { 
         [loadinglabel setText:@"Loading Data Komisi from server . . ."]; 
         [NSThread detachNewThreadSelector:@selector(getDataKomisi) toTarget:self.viewKomisi withObject:nil]; 
    } 
    

    をのように...

    +0

    を作成しました。 "getChartData"は、メインコントローラから呼び出された別のView Controller上にあるため、動作しませんでした。 –

    +0

    huh ..あなたのコードが表示されず、そのような問題のデフォルト解決.. – Stas

    +0

    私はあなたのソリューションを試してみましたが、それは動作しませんでしたが、助けてくれてありがとう:) –

    関連する問題