我有一个带有多个选项卡 View 项目的NSTabView
。当用户点击某个按钮时,选项卡 View 会更改为这些项目之一,以显示从网站 api 返回的内容。我尝试创建一个中间选项卡 View 项来告诉用户它正在获取数据,然后一旦获取就会显示它。
[tabView selectTabViewItemAtIndex:0]; // This is the intermediate tab
/*
Fetching
data from
the api
here
*/
[tabView selectTabViewItemAtIndex:1]; // Displaying the data tab
但是第一个选项卡永远不会显示,只显示最后一个选项卡。我想是不是只是获取数据很快,没来得及展示,但是我中途设置了断点,还是没有改变。好像最后才变了,奇怪。
有什么想法吗?
更新:
感谢您的回答,已修复如下
[tabView selectTabViewItemAtIndex:0]; // This is the intermediate tab
dispatch_queue_t queue = dispatch_queue_create("com.mycompany.queue", 0);
dispatch_async(queue, ^{
/*
Fetching
data from
the api
here
*/
[tabView selectTabViewItemAtIndex:1]; // Displaying the data tab
});
最佳答案
获取数据的API是否同步操作?我敢打赌确实如此。
用户界面只会在主线程上运行的运行循环结束时更新。如果处理获取的 API 在同一个线程中运行,那么事情最终会像这样工作:
- 开始运行循环
- 您选择标签索引 0
- 您获取数据。
- 您选择标签索引 1
- 用户界面更新,显示选项卡索引 1。
您可能需要在后台线程中运行数据获取例程。然后,当它返回数据时,告诉 NSTabView 选择选项卡索引 1。由于数据获取发生在后台,运行循环将有机会多次更新 UI,这将导致选项卡索引 0 变得可见(对于无论如何)。
您可以使用几种不同的方法在后台运行数据获取。显而易见的是使用 Grand Central Dispatch,或者您也可以使用属于 NSObject 协议(protocol)一部分的“performSelectorInBackground:”系列方法。
此外,您应该始终非常小心在主线程上执行的操作。从网站获取数据可能需要一段时间。如果您在主线程上同步运行该操作,那么在您等待数据获取完成时,用户界面将完全无响应。苹果在他们的多线程文档中谈到了这一点。绝对值得一读。这和 Grand Central Dispatch - 它使多线程变得更加容易。
关于objective-c - 用一种方法两次更改 nstabview 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7851924/