removeAllObservers观察者未被删除

时间:2014-09-24 16:43:48

标签: firebase

删除观察者时遇到问题;即使在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元素触发了观察者事件。

我错过了什么?

修改 看来只有在对象上隐式设置对象才能被删除。即,如果您在对象上设置观察,则可以删除该观察。但它不能在被观察的第一个对象的子对象上删除?

1 个答案:

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