gpt4 book ai didi

objective-c - 用一种方法两次更改 nstabview 项目

转载 作者:行者123 更新时间:2023-12-03 17:06:06 24 4
gpt4 key购买 nike

我有一个带有多个选项卡 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 在同一个线程中运行,那么事情最终会像这样工作:

  1. 开始运行循环
  2. 您选择标签索引 0
  3. 您获取数据。
  4. 您选择标签索引 1
  5. 用户界面更新,显示选项卡索引 1。

您可能需要在后台线程中运行数据获取例程。然后,当它返回数据时,告诉 NSTabView 选择选项卡索引 1。由于数据获取发生在后台,运行循环将有机会多次更新 UI,这将导致选项卡索引 0 变得可见(对于无论如何)。

您可以使用几种不同的方法在后台运行数据获取。显而易见的是使用 Grand Central Dispatch,或者您也可以使用属于 NSObject 协议(protocol)一部分的“performSelectorInBackground:”系列方法。

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

关于objective-c - 用一种方法两次更改 nstabview 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7851924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com