1

ブロックを使用してネットワーク関連のタスクを実行しています

でブロックが完了したらUITableViewController、tableviewcontroller をリロードしたい

__unsafe_unretained UITableView *unretTableView = self.tableview;

[myRequest postWithCompletion:(bool finished) {
    [unretTableView reloadData];
}];

deallocateこれは問題ありませんが、リクエストが完了する前に ( )を離れると、メソッド (呼び出されている) で設定したにもかかわらず、割り当て解除されたインスタンスに送信された割り当て解除されたオブジェクト ( )メッセージUITableViewControllerを指しているように見えますunretTableView[UITableViewController dealloc]self.tableview = nil;

追加の詳細:

  • __weakiOS 4.3 以上を対象としています。
  • のメソッドでは、設定しUITableViewControllerますdeallocself.tableview = nil
  • ページを離れたときにネットワーク リクエストをキャンセルしたくありません。実行し続けたいのです。
  • 編集:ブロックにself.tableviewを保持したくない

ありがとう!

4

4 に答える 4

1

あなたのコメントを考えると、私はを追求する傾向があるかもしれませんNSOperationQueue。このようにあなたはすることができます

  1. 背景を作成しますNSOperationQueue;

  2. ダウンロードで一定の妥当な数の同時ダウンロードが許可されている場合は、設定できますmaxOperationCount(または、シリアルが必要な場合は、これを1に設定します)。

  3. バックグラウンドジョブを開始するときに、オブジェクトを作成するか、を介してwithブロックNSOperationに直接送信することができます。旗をチェックする機能を楽しみたい場合は、前者を行う必要があるかもしれません。NSOperationQueueaddOperationWithBlockisCancelled

  4. 各操作は、View Controllerを更新する前に、キャンセルされたかどうかを確認できます。

  5. cancelAllOperationsビューコントローラを閉じると、キューに入れられているすべてのものを簡単にキャンセルできます。

ランダムな例を次に示します。

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.queue = [[NSOperationQueue alloc] init];
    self.queue.maxConcurrentOperationCount = 4;

    // let's add 100 operations to our queue

    for (NSInteger i = 0; i < 100; i++)
    {
        NSBlockOperation *operation = [[NSBlockOperation alloc] init];
        __unsafe_unretained NSBlockOperation *weakOperation = operation; // it seems vaguely disturbing to do this with __unsafe_unretained, but given that the operation queue is taking care of this for us, I believe it's ok
        [operation addExecutionBlock:^{

            NSLog(@"Beginning operation %d", i);

            sleep(10);

            if ([weakOperation isCancelled])
                NSLog(@"Operation cancelled %d", i);
            else
            {
                // go ahead and update UI if you want
                NSLog(@"Finished operation %d", i);
            }
        }];

        [self.queue addOperation:operation];
    }
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
    [self.queue cancelAllOperations];
}
于 2012-12-10T22:19:55.543 に答える
0

後でプロパティを設定する内容は、ブロックによってキャプチャされた変数の設定内容とは関係ありません。プロパティにアクセスする場合は、foo ではなく、self.foo というプロパティにアクセスする必要があります。

ブロック内で自己をキャプチャすると自己が保持され、保持サイクルが発生する可能性があるため、その場合でも注意する必要があることに注意してください。

(編集)別のスレッドからプロパティを更新している場合、これはまだ安全ではありません。それを安全にするために、何らかの形式のシリアライゼーション構造が必要になります (NSLock、NSOperationQueue、dispatch_queue_t など)。これはスレッド化されていないと思いますが、念のためにスレッド化されていることは重要です。

于 2012-12-10T21:39:56.563 に答える
-1

これを試して:

__block __unsafe_unretained UITableView *unretTableView = self.tableview;

編集

リクエストの投稿に使用するフレームワークはわかりませんが、[myRequest postWithCompletion:yourBlock]を使用してリクエストを投稿する場合、 myRequest.completion=nilのように完了ブロックを変更する方法もあると思います。

于 2012-12-10T21:36:46.630 に答える
-2

健全性チェックを挿入します。

__weak UITableView *table = unretTableView;
if (table) [unretTableView reloadData];
于 2012-12-10T21:35:10.880 に答える