2012-05-10 99 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的方法。

從邏輯上講,這應該讓應用程序顯示進度已經走了多遠。但標籤保持在「從服務器加載圖表數據」並且不會相應地改變我的代碼。

我已經試過這兩個主線程和使用dispatch_queue,既沒有顯示出差異

感謝

回答

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 
} 

因爲每個操作對先前的操作的依賴,他們將執行一前一後,但在某些後臺線程。使用操作和操作隊列有超過GCD的優勢,因爲

  • 您可以使用-addDependency:
  • 行動已內置機制,消除容易建模操作之間的依賴關係。如果用戶決定中途退出應用程序,則可以發行

    [queue cancelAllOperations]; 
    

    隊列上尚未啓動的所有操作都將被取消。

+0

謝謝你的答案哥們,但目前我遠離我的Mac在辦公室。一旦我測試了這個,我會讓你知道更新,謝謝你的通過解釋,+1 :) :) –

+0

是的,這一個是解決方案所有權利 –

1

這是因爲你在加載主線程上的數據,因爲主線程是超級忙,它從不更新顯示。

您需要將數據加載到另一個線程,例如,將更新信息發送到主線程。

+0

我試過使用dispatch_async加載數據,仍然沒有改變數據加載之間的標籤。 –

+1

在dispatch_async中,是否在主隊列中加載標籤? –

+0

不,我把它添加到我創建的隊列中 –

0

我認爲你做前人的精力類似的東西:

- (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」在另一個視圖控制器上,這是從主控制器調用,所以沒有工作 –

+0

呵呵..我沒有看到你的代碼,我發佈了默認解決這樣的問題.. – Stas

+0

好吧,我試過你的解決方案,但它沒有工作,但謝謝你的幫助:) –