2011-10-21 15 views
1

我有一个NSTabView与几个选项卡查看项目。当用户点击某个按钮时,tabview会变为其中一个项目以显示从网站api返回的内容。我试图创建一个中间选项卡视图项来告诉用户它正在提取数据,然后一旦获取它将显示它。在一种方法中更改nstabview项目两次

[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 
}); 
+0

用户界面只在运行循环之间更新,因此您必须选择中间选项卡,异步执行提取,然后在提取完成时选择下一个选项卡。 –

回答

2

这是否获取数据同步操作的API?我敢打赌,它确实如此。

用户界面只会在运行在主线程上的运行循环结束时更新。如果处理抓取的API在同一个线程中运行,然后事情会落得这样的工作:

  1. 开始运行循环
  2. 您选择Tab键索引0
  3. 你获取了这些数据。
  4. 您选择Tab键索引1次
  5. 的UI更新,显示标签索引1

你可能需要在你的数据在后台线程获取例程。然后,当它返回数据时,告诉NSTabView选择标签索引1.由于数据获取发生在后台,运行循环将有机会不止一次更新UI,这会导致标签索引0变为可见(对于无论如何,短暂的)。

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

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

+0

谢谢你。看着GCD,它现在像一个魅力:) – BytesGuy