NSNotificationCenter
'sと同様の動作を実装したい-addObserverForName:object:queue:usingBlock:
。次のようなメソッドを使用する
- (void)addRefetchObserver:(id)observer
handler:(FJRefetchHandler)handler;
ブロックは、後で呼び出すために保存する必要があります(FJRefetchHandler
次のように定義されます:typedef void(^FJRefetchHandler)(void)
。
後でブロックを削除したいのでobserver
、次のメソッドも保存して宣言します。
- (void)removeRefetchObserver:(id)observer;
使用法は次のようになります。
// some place in code
[controller addRefetchObserver:self handler:^{
// refetch some stuff, i.e.
self.data = [self updateData];
}];
// some other place in code:
[controller removeRefetchObserver:self];
私の質問は-addRefetchObserver:handler:
、保持サイクルを作成しないようにどのように実装する必要があるかということです。オブザーバーとハンドラーをどのように保存する必要がありますか?
どうやら、NSNotificationCenter
オブザーバーを保持せずに保存しているようです。そうしないと、呼び出さ[center removeObserver:self]
れないため、呼び出す-dealloc
ことができ-dealloc
ません。
また、ブロック内で__unsafe_unretained
参照するときに使用を回避する方法はありますか?self
つまり、そのように:
__unsafe_unretained MyObject *blockSelf = self;
[controller addRefetchObserver:self handler:^{
blockSelf.data = [blockSelf updateData];
}];