1

私は自分のアプリでネットワーク リクエストを実行する作業を行っており、NSOperationQueue で NSBlockOperations を使用してこれを非同期的に実行しています。ただし、これらの操作を呼び出したView Controllerの割り当てが解除された場合(ナビゲーションスタックからポップされた場合)、これらの操作をキャンセルできるようにしたいと考えています。

これは私が持っているものの簡略化されたバージョンです:

NSArray *posts;

__weak DataController *weakSelf = self;
NSBlockOperation *fetchPostsOperation = [NSBlockOperation blockOperationWithBlock:^{
    DataController *strongSelf = weakSelf;
    NSDictionary *response = [weakSelf refreshPostsInPart:PartFirst];
    posts = [response objectForKey:@"posts"];
}];

[self.queue addOperation:fetchPostsOperation];

DataControllerの refreshPostsInPart:メソッドでは、while ループを使用して、App.net からページ分割されたデータに対して繰り返しネットワーク リクエストを行います。ループの反復ごとに、DataController self.isCancelled(BOOL 型) のプロパティをチェックし、そうであれば、NOリクエストを作成し続けます。

deallocDataControllerのメソッドで、このプロパティを に設定YESして、while ループの次の繰り返しでリクエストの作成を停止します。cancelAllOperations本質的に、 NSBlockOperation を使用している間、私は貧乏人を実装しています。

質問:私の dealloc メソッドで を設定self.isCancelledするとき、ブロックで使用されている strongSelf 参照も設定していますか?NOself.isCancelled

4

1 に答える 1

2

selfweakSelf、およびstrongSelfすべてがメモリ内の同じオブジェクトを参照します。つまり、(そのプロパティを設定して) にメッセージを送信し、selfこのdealloc更新weakSelfstrongSelfれたプロパティについて「知っている」ことを意味します。そうです、あなたも設定していますself.isCancelled(おそらく実際のプロパティの名前はself.cancelledであり、そのゲッターは ですisCancelled) strongSelf

于 2014-02-21T23:58:54.727 に答える