Objective c 在一种方法中更改nstabview项两次
我有一个Objective c 在一种方法中更改nstabview项两次,objective-c,xcode,macos,cocoa,Objective C,Xcode,Macos,Cocoa,我有一个NSTabView,其中有几个选项卡视图项。当用户点击某个按钮时,选项卡视图将更改为这些项目之一,以显示从网站api返回的内容。我试图创建一个中间选项卡视图项,告诉用户它正在获取数据,然后一旦获取数据,它就会显示它 [tabView selectTabViewItemAtIndex:0]; // This is the intermediate tab /* Fetching data from the api here */ [tabView selectT
NSTabView
,其中有几个选项卡视图项。当用户点击某个按钮时,选项卡视图将更改为这些项目之一,以显示从网站api返回的内容。我试图创建一个中间选项卡视图项,告诉用户它正在获取数据,然后一旦获取数据,它就会显示它
[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在同一个线程中运行,那么事情最终会是这样的:
此外,对于在主线程上执行的操作,您应该始终非常小心。从网站获取数据可能需要一段时间。如果在主线程上同步运行该操作,则在等待数据获取完成时,用户界面将完全没有响应。苹果在他们关于多线程的文档中谈到了这一点。。绝对值得一读。这和Grand Central Dispatch—它使多线程变得更加容易。UI只在运行循环之间更新,因此您必须选择中间选项卡,异步执行抓取,然后在抓取完成时选择下一个选项卡。谢谢。查看GCD,它现在就像一个符咒:)