我有一個分段控制被用作切換。當切換時,我在表格視圖中切換了一堆內容,這些內容佔用了很少但很明顯的時間(插入/刪除表格視圖中的部分,動畫更改等)。我希望分段控制立即響應選擇。所以在我的行動處理代碼分段控制的UIControlEventValueChanged事件,我做了以下內容:保持一個UISegmentedControl(等)響應
- (IBAction)groupingChanged:(id)sender {
UISegmentedControl *seg = sender;
[tableModel toggleOn:[seg selectedSegmentIndex] == ToggleOnIndex];
[self performSelectorOnMainThread:@selector(updateGrouping)
withObject:nil
waitUntilDone:NO];
}
其中updateGrouping
是:
- (void)updateGrouping {
MXAssertMainThread();
[tableView beginUpdates];
... several table updates
[tableView endUpdates];
}
設置waitUntilDone:NO
允許groupingChanged
方法來完成updateGrouping
被調用之前,但這似乎不足以重新繪製視圖。分段控制一直持續到表完成更新,然後切換。
於是,我就修改groupingChanged:
創建一個線程,像這樣的更新:
- (void)delayed {
[self performSelectorOnMainThread:@selector(updateGrouping)
withObject:nil
waitUntilDone:NO];
}
- (IBAction)groupingChanged:(id)sender {
UISegmentedControl *seg = sender;
[tableModel toggleOn:[seg selectedSegmentIndex] == ToggleOnIndex];
[self performSelectorInBackground:@selector(delayed) withObject:nil];
}
這確實工作。分段控制立即切換,表格隨即顯示。但我對結果一點都不信任。這只是在新線程啓動時給主線程一個暫緩的副作用嗎?這只是我需要如何排隊更新到用戶界面?這顯然很不好。我希望有人在這種情況下有更好的模式。
這消除了臨時線程,所以這是一個改進,但我拒絕相信沒有常見的非hacky模式。 – 2009-07-29 17:54:18