1

我試圖讓在後臺的一些數據和刷新的tableview在搜索欄中鍵入的時候,有我當前的代碼:調度不能正常工作

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     Games * game = [[Games alloc] init]; 
     NSArray * temp = [game comingSoonWithPlatform:@"pc" header:[game gameHeader] parseLink:[game gameComingSoonListLinkWithPlatform:@"pc"]]; 
     self.searchArray = [temp valueForKey:@"results"]; 
     [self.tableView reloadData]; 
    }); 
} 

我在做什麼錯?如果我在搜索欄中再輸入一個單詞,或者點擊取消按鈕,它會刷新並且數據出現在tableview中。

回答

2

從主線程要創建後臺線程,和做任何處理後,有你需要切換到主線程更新UI替換行

[self.tableView reloadData]; 

例如,你可以做你的編碼的東西在下面方法原樣

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    // [activityIndicator startAnimating]; 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     // do your background code here 
     Games * game = [[Games alloc] init]; 
     NSArray * temp = [game comingSoonWithPlatform:@"pc" header:[game gameHeader] parseLink:[game gameComingSoonListLinkWithPlatform:@"pc"]]; 
     self.searchArray = [temp valueForKey:@"results"]; 

     dispatch_sync(dispatch_get_main_queue(), ^{ 
      // you are now on the main queue again, update ui here 
     //[activityIndicator stopAnimating]; 
     [self.tableView reloadData]; 
     }); 
    }); 
} 
+1

你應該把'self.searchArray'分配調度到主隊列裏面了。 (這是你在主線程中使用的一個對象,所以你不應該從後臺線程中改變它。同步你的訪問,通過簡單地把這個任務放到你發送回主線程的塊中很容易實現。 )另外,這裏不需要'dispatch_sync'。 'dispatch_async'會更好。 – Rob

+0

非常感謝你們 – pluck

2

電話[self.tableView reloadData];必須在主線程上。與

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.tableView reloadData]; 
});