我有一个分段控制被用作切换。当切换时,我在表格视图中切换了一堆内容,这些内容占用了很少但很明显的时间(插入/删除表格视图中的部分,动画更改等)。我希望分段控制立即响应选择。所以在我的行动处理代码分段控制的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