Изменение элемента nstabview дважды в одном методе - PullRequest
1 голос
/ 21 октября 2011

У меня есть 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
});

1 Ответ

2 голосов
/ 21 октября 2011

Работает ли API, который выбирает данные, синхронно? Я готов поспорить, что это так.

Пользовательский интерфейс будет обновляться только в конце цикла выполнения, запущенного в главном потоке. Если API, который обрабатывает выборку, выполняется в том же потоке, то все закончится так:

  1. Begin Run Loop
  2. Вы выбираете индекс табуляции 0
  3. Вы получаете данные.
  4. Вы выбираете вкладку указатель 1
  5. Обновляется пользовательский интерфейс, отображается индекс вкладки 1.

Вам, вероятно, нужно запустить процедуры извлечения данных в фоновом потоке. Затем, когда он возвращает данные, скажите NSTabView выбрать индекс вкладки 1. Поскольку выборка данных происходит в фоновом режиме, цикл выполнения будет иметь возможность обновлять пользовательский интерфейс более одного раза, что должно привести к тому, что индекс вкладки 0 станет видимым (для короткое время в любом случае).

Вы можете запустить выборку данных в фоновом режиме, используя несколько различных методов. Очевидными являются использование Grand Central Dispatch или вы также можете использовать серию методов "executeSelectorInBackground:", которые являются частью протокола NSObject.

Также вы должны ВСЕГДА быть очень осторожными в отношении того, какие операции вы выполняете в главном потоке. Получение данных с веб-сайта может занять некоторое время. Если вы выполняете эту операцию синхронно в главном потоке, пользовательский интерфейс будет полностью не реагировать, пока вы ждете завершения этой выборки данных. Apple говорит об этом в своей документации по многопоточности. Определенно стоит прочитать. Это и Grand Central Dispatch - это значительно упрощает многопоточность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...