2011-07-13 76 views
1

我有一個奇怪的問題時。我有一個Tab Bar應用程序,其中我爲每個不同的選項卡使用一個導航控制器,每個導航控制器都有它自己的View Controller來顯示一些內容。iOS版 - viewDidAppear:延遲顯示一個UITableView

當我觸摸一個選項卡時,我希望選項卡能夠立即加載視圖並加載後(viewDidAppear:)我希望它能夠在viewDidAppear:方法中下載一些數據。

爲了測試這個功能,我已經安裝了下面的方法。我正在使用NSThread來模擬一些冗長的操作,這些操作應該在視圖加載後在後臺完成。然後,我給NSArray * test(nonatomic,retain)分配一些測試數據並重新載入表格。

我重裝了表,因爲在viewDidLoad方法我設置表格只包含一個空字符串(這是因爲我讀該表是viewDidAppear前設置:被稱爲

- (void)viewDidAppear:(BOOL)animated { 

    [super viewDidAppear:animated]; 

    DLog(@"viewDidAppear running"); 

    [NSThread sleepForTimeInterval:10]; 

    NSArray *array = [[NSArray alloc] initWithObjects:@"Test1", @"Test2", @"Test3", @"Test4", @"Test5", @"Test6", nil]; 
    self.test = array; 

    [array release]; 

    [table reloadData]; 
} 

所以我的預期行爲應該是,當觸摸這個特定的選項卡時,它應該立即加載,然後在10秒鐘後它應該填充來自viewDidAppear:方法的表格數據但是而不是當觸摸此選項卡時等待10秒,然後顯示填充了表格數據的視圖。

回答

1

調用[NSThread sleepForTimeInterval:10];將阻止主線程進行任何更新,因此您看不到任何用戶界面更改。如果你想拖延如上表數據重新加載,檢查NSObject performSelector:withObject:afterDelay:NSObject Class Reference

把代碼reloadData和陣列設置的方法的通過performSelector:withObject:afterDelay:

+0

我認爲那正是我正在尋找的,但是你也許知道爲什麼我的表沒有在viewDidAppear之前顯示:?我的表正在等待viewDidAppear:方法運行,然後顯示錶。 –

+0

如果您在viewDidAppear中「阻止」代碼執行,用戶界面將無法繪製和刷新自己,因爲ui刷新(主要)是由該主線程完成的。因此,在該方法運行後,系統將運行代碼以實際繪製用戶界面和表格。這有幫助嗎? – marcus

+0

如果我刪除了NSThread調用,viewDidAppear仍然會延遲。至於我的理解,視圖應該在loadView運行後立即顯示,然後執行viewDidAppear中的任何內容。但這裏的情況是視圖不是立即顯示,而是等待viewDidAppear方法運行,然後顯示視圖。 –

0

你不把錯誤的線程睡覺? (即,將創建該陣列的一個)

看來你等待10秒,然後調用表reloadData。

你爲什麼要等待呢?你不希望數據可用時填充tableView嗎?

+0

我只是使用NSThread來模擬冗長的操作。我可以從互聯網上下載數據,而不是使用NSThread。 –

0
-(void)executeMe{ 


     NSArray *array = [[NSArray alloc] initWithObjects:@"Test1", @"Test2", @"Test3", @"Test4", @"Test5", @"Test6", nil]; 
     self.test = array; 

     [array release]; 



     [table reloadData]; 



    } 







    - (void)viewDidAppear:(BOOL)animated { 

     [super viewDidAppear:animated]; 

     DLog(@"viewDidAppear running"); 



     [self performSelector:@selector(executeMe) withObject:nil afterDelay:10]; 


    } 
+0

這不起作用。 –

+0

嘗試使用這個新代碼 –

1

其他的答案解釋爲什麼你的主線程被阻塞時,調用它您使用+[NSThread sleepForTimeInterval:]方法。

要處理下載從網上,你應該把你的下載任務到後臺線程,以避免阻塞主線程就像你在這裏做。您可以使用Grand Central Dispatch來實現此目的。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{ 
    /* Download stuff */ 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     /* Send UI updates back to the main thread. */ 
     [self.tableView reloadData]; 
    }); 
}); 
+0

謝謝,你有沒有機會回答我的問題回覆@marcus? –