Как обновить UItableview после executeSelectorInBackground? - PullRequest
1 голос
/ 15 октября 2011

У меня есть UIView с двумя представлениями внутри, один - страница о нас, другой - поток / страница твиттера, управляемая с помощью uisegmentation.

Твиттер работает на didFinishLaunchingWithOptions и работает в фоновом режиме.

На самой странице твиттера у меня есть кнопка перезагрузки, которая запускает тот же процесс, снова выполняя в фоновом режиме.

Я застрял, потому что табличное представление никогда не обновляется, даже с

[self.tableView reloadData];

сразу после executeInSelector.

Таким образом, я хочу выполнить обновление данных таблицы один раз:

[self executeSelectorInBackground: @selector (reloadTwitter :) withObject: nil];

закончен.

Как мне выполнить такую ​​задачу?

Ответы [ 2 ]

4 голосов
/ 15 октября 2011

Первый ответ, вероятно, сработает, но вас может не заинтересовать использование GCD и блоков. В целом реальная проблема, скорее всего, заключается в том, что вы не должны пытаться обновить какие-либо элементы пользовательского интерфейса в фоновом потоке - вы должны делать это из основного потока.

Таким образом, ваш лучший вариант - это, вероятно, добавить еще одну строку в метод, который обновляет ленту твиттера:

[self.tableview performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:No];

У Apple есть документация по этому вопросу здесь:

http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/AboutThreads/AboutThreads.html#//apple_ref/doc/uid/10000057i-CH6-SW2

Проверьте раздел с пометкой «Темы и ваш пользовательский интерфейс».

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

использовать GCD и блоки для этого ...:)

/* get a background queue (To do your things that might take time) */
dispatch_queue_t backgroundQueue = 
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
/* get the main queue (To update the UI)*/
dispatch_queue_t mainQueue = dispatch_get_main_queue();

/* use dispatch_async to run something (twitter, etc)
   asynchronously in the give queue (in the background) */
dispatch_async(backgroundQueue,^{
  [self reloadTwitter];
  /* use again dispatch_async to update the UI (the table view)
     in another queue (the main queue) */
  dispatch_async(mainQueue,^{
    [self.tableView reloadData];
 });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...