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];
}];