我想实现类似于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];
}];