2012-09-21 92 views
1

我在數據的getter方法中將數據異步加載到數組。異步數據加載和重新加載之間的時間間隔UITableView

首先它產生一個空數組,所以自然我的表加載0行。

當數據完成加載後,我打電話reloadData來更新我的表格,但是,下載的數據和顯示數據的UITableView之間似乎有約6秒的間隔。

有誰知道這可能發生的任何原因?

我使用dispatch_async方法,優先級爲高。

我甚至在加載數據和插入數據的過程中記錄了每個點,它顯示了這一點。另外,如果我在上載和下載數據時一直上下滾動表格,表格會盡快顯示其數據,而不是在插入之間存在此差距。

代碼:

- (NSMutableDictionary *)tableDictionary { 
    if (!_tableDictionary) { 
     _tableDictionary = [NSMutableDictionary dictionary]; 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
      NSString *URLString = @"http://www.urlToData.com/path/to/file.php?foo=bar"; 

      NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:URLString]]; 
      NSError *error = nil; 

      NSDictionary *objectIDs = [NSJSONSerialization JSONObjectWithData:data options:NSJSONWritingPrettyPrinted error:&error]; 

      NSMutableDictionary *objects = [NSMutableDictionary dictionary]; 

      for (NSInteger i = 0; i < objectIDs.allValues.count; i++) { 
       NSArray *eventIDs = (objectIDs.allValues)[i]; 
       NSString *eventType = (objectIDs.allKeys)[i]; 

       [objects setValue:[myObject initWithIDs:objectIDs] forKey:@"key"]; 
      } 

      self.tableDictionary = objects; 
      self.titlesForSectionHeader = objects.allKeys; 

      NSLog(@"Done"); 
      [self.tableView reloadData]; 
     }); 
    } 
    return _tableDictionary; 
} 
+0

你可以發表一些頌歌嗎? – ElasticThoughts

+0

添加上面的代碼 –

+0

在主線程上重新載入tableView的數據。 – danielbeard

回答

1

嘗試重新加載這樣在主線程的實現代碼如下的數據:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
     //background processing goes here 
     //This is where you download your data 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      //update UI here 
      [self.tableView reloadData]; 
     }); 
}); 
+0

謝謝!我使用後臺線程的唯一原因是因爲它停止了與應用程序的所有交互,此解決方案非常完美! –

+0

您仍然只能在主線程上更新您的UI,因此您必須在主線程上分派另一個異步隊列來執行更新。 – jmstone617

0

正如@danielbeard的代碼稍加修改。我會建議影響當前對象的所有代碼都在主隊列上完成。如果KVO或set屬性更新UI,這可以避免惡意的意外。

最後,我不會使用DISPATCH_QUEUE_PRIORITY_HIGH。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    // Stuff 'n stuff 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     self.tableDictionary = objects; 
     self.titlesForSectionHeader = objects.allKeys; 

     NSLog(@"Done"); 
     [self.tableView reloadData]; 
    }); 
}); 
+0

是的,我也是這麼做的:)最初它是'DISPATCH_QUEUE_PRIORITY_DEFAULT',但我一定忘記在試圖找出問題時將其改回,謝謝! –

相關問題