UITableView перезагружается до запуска NSoperationQueue - PullRequest
0 голосов
/ 09 февраля 2012

Я использую NSOperationQueue для вызова службы в фоновом режиме в viewWillAppear (я также пытался поместить его в viewDidLoad в этом отношении).Я заполняю UITableView на основе результатов, полученных от службы.Когда я отлаживаю приложение, сначала вызывается таблица, а затем operationQueue .Таким образом, стол для меня пуст.Как заполнить таблицу после операция Queue выполняет свою работу.

Вот код:

viewWillAppear :

-(void)viewWillAppear:(BOOL)animated
{
    operationQueue=[[NSOperationQueue alloc] init];
    ParseOperation *obj=[[ParseOperation alloc] initWithMembers:ID];
    [operationQueue addOperation:obj];
    [obj release];

}  

Ответы [ 3 ]

1 голос
/ 09 февраля 2012

Вы можете добавить «reloadTable» как определенную операцию с зависимостью от операции разбора, сразу после определения операции разбора и непосредственно перед запуском очереди (поэтому для безопасности инициализируйте очередь как приостановленную, а затем запустите ее только после всех операцийбыли добавлены):


// ... inside your operation code definition
NSInvocationOperation *reloadOp = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(myReload) object:nil];
[reloadOp addDependency:obj] // adding here the parse operation as a dependency
[operationQueue addOperation:reloadOp];

Операция "myReload" должна быть определена как автономный метод, чтобы гарантировать, что метод reloadTable вызывается в основном потоке:

-(void)myReload { [table performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; }

Таким образом, ваш код перезагрузки будет запущен только после завершения операции разбора.Это полезно, если вам нужно выполнить больше операций, и все они должны быть выполнены до перезагрузки таблицы.Обратите внимание, что зависимость не знает о том факте, что операция завершилась нормально или была отменена.

Другой хороший способ, который вы можете рассмотреть, - это определить последовательную очередь GCD и добавить два блока последовательно (первый блок разбираетсявторой блок - перезагрузка таблицы).В таком случае GCD гарантирует правильный порядок выполнения двух блоков (FIFO).

1 голос
/ 09 февраля 2012

Вы должны установить блок завершения для вашей NSOperation.Где вам нужно вызвать данные перезагрузки в вашем табличном представлении.

- (void)setCompletionBlock:(void (^)(void))block

Редактировать:

добавить это

[obj setCompletionBlock:^{
                                NSLog(@"I have fnish");
                                 [self.tableView reloadData];
                                } 
     ]; 
0 голосов
/ 09 февраля 2012

Позвоните [tableView reloadData] после завершения operationQueue.

...