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

标签 objective-c xcode macos cocoa

我有一个带有多个选项卡 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/

相关文章:

iphone - 启动 iOS 模拟器时 XCode 锁定

ios - 无效的 Swift 支持 - 文件不在正确的位置

ios - 如何在 Xcode 的 map 中显示我当前的位置?

objective-c - 程序中出现意外的 "@"

ios - 我已使用桥接 header 将 Objective-C 文件导入到 Swift 项目中,但出现错误 "Expected a type"

ios - 正确使用 intrinsicContentSize 和 sizeThatFits : on UIView Subclass with autolayout

objective-c - Cocos2d : CCMenu Item not responding to touch after resuming application

java - JVM 1.6.0_65 版本不适合本产品

macos - NSRunningApplication activateWithOptions 方法行为随 Big Sur 发生变化

macos - OSX 上适合 Corona SDK 的 IDE 好用吗?