0

我编写了以下代码来从 NSInvocationOperation 重新加载 UITableView。但是调用后界面很长时间没有更新[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];
}
4

1 回答 1

2

问题是 UI 更新必须发生在主线程上,并且 reloadData 是通过 NSOperationQueue 从后台线程调用的。

您可以使用 NSObject 方法performSelectorOnMainThread:withObject:waitUntilDone:来确保此类更新发生在主线程上。

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

此外,NSOperationQueue不应是局部变量。它应该是此类的保留属性,并且仅在dealloc.

于 2012-02-15T06:22:04.730 回答