Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在一种方法中更改nstabview项两次_Objective C_Xcode_Macos_Cocoa - Fatal编程技术网

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在同一个线程中运行,那么事情最终会是这样的:

  • 开始运行循环
  • 您可以选择选项卡索引0
  • 你获取数据
  • 您可以选择选项卡索引1
  • UI将更新,显示选项卡索引1
  • 您可能需要在后台线程中运行数据获取例程。然后,当它返回数据时,告诉NSTabView选择选项卡索引1。由于数据提取发生在后台,因此运行循环将有机会多次更新UI,这将导致选项卡索引0变为可见(无论如何,在短时间内)

    您可以使用两种不同的方法在后台运行数据获取。最明显的方法是使用Grand Central Dispatch,也可以使用作为NSObject协议一部分的“performSelectorInBackground:”系列方法


    此外,对于在主线程上执行的操作,您应该始终非常小心。从网站获取数据可能需要一段时间。如果在主线程上同步运行该操作,则在等待数据获取完成时,用户界面将完全没有响应。苹果在他们关于多线程的文档中谈到了这一点。。绝对值得一读。这和Grand Central Dispatch—它使多线程变得更加容易。

    UI只在运行循环之间更新,因此您必须选择中间选项卡,异步执行抓取,然后在抓取完成时选择下一个选项卡。谢谢。查看GCD,它现在就像一个符咒:)