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 に答える