删除观察者时遇到问题;即使在removeAllObservers
之后,该事件似乎也会触发这是数据结构
listOfItems
Item 1
Key:Value
Item 2
Key:Value
最初,正在观察listOfItems
[refToListOfItems observeEventType:FEventTypeValue withBlock:^(FDataSnapshot *snapshot) {
NSLog(@"responding to value change in the list of items");
}];
但是在某些时候,我想更新第1项Key:Value对而不被观察,所以我从第1项中删除了观察者
[refToItem1 removeAllObservers];
然后继续更新第1项的字典
NSDictionary *testData = @{
@"newKey": @"newValue"
};
[refToItem1 updateChildValues:testData];
但仍然为refToItem1元素触发了观察者事件。
我错过了什么?
修改 看来只有在对象上隐式设置对象才能被删除。即,如果您在对象上设置观察,则可以删除该观察。但它不能在被观察的第一个对象的子对象上删除?
答案 0 :(得分:3)
如果我正确地理解你,我自己也会遇到这个问题。将refToItem1
存储在iVar中将无法正常工作,因为每次循环都会覆盖它。
我的解决方案是将子Firebase引用存储在数组中,然后在我想删除所有观察者时循环遍历该数组。
e.g。
self.parentRef = [[Firebase alloc] initWithUrl:@"url"];
NSMutableArray *childObservers = [[NSMutableArray alloc] init];
[self.parentRef observeEventType:FEventTypeValue withBlock:^(FDataSnapshot *snapshot) {
Firebase *childRef = [ref childByAppendingPath...];
[childObservers addObject:childRef];
[ref observeEventType:FEventTypeValue withBlock:^(FDataSnapshot *childSnapshot) {
... observations
}];
}];
然后删除观察者:
- (void)stopObserving {
[self.parentRef removeAllObservers];
for (Firebase *ref in self.childObservers) {
[ref removeAllObservers];
}
}