перезагрузить UITableView из NSOperation - PullRequest
0 голосов
/ 15 февраля 2012

Я написал следующий код для перезагрузки UITableView из NSInvocationOperation. Однако интерфейс долго не обновляется после вызова [tableview reloadData].

В документации Apple говорится, что метод делегата не будет вызываться в NSOperation.

NSOperationQueue *queue = [NSOperationQueue new];

NSInvocationOperation *operation = [[NSInvocationOperation alloc]
                                            initWithTarget:self
                                            selector:@selector(connectToServer)
                                            object:nil];

[queue addOperation:operation];
[operation release];
[queue autorelease];

- (void) connectToServer
{
    ...
    ...
    [tableview reloadData];
}

1 Ответ

2 голосов
/ 15 февраля 2012

Проблема заключается в том, что обновления пользовательского интерфейса должны происходить в основном потоке, а reloadData вызывается из фонового потока через NSOperationQueue.

Вы можете использовать метод NSObject executeSelectorOnMainThread: withObject: waitUntilDone: , чтобы такие обновления происходили в основном потоке.

- (void) connectToServer
{
    ...
    ...
    [tableView performSelectorOnMainThread:@selector(reloadData)
            withObject:nil
            waitUntilDone:NO];
}

Кроме того, NSOperationQueue не должно быть локальной переменной. Это должно быть сохраненным свойством этого класса, и оно может быть выпущено только в dealloc.

...