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