2016-11-23 1 views
0

두 개의 참조 (동일한 경로에 대한 참조)가 있습니다. 하나는 보류중인 주문을 수신하고 다른 하나는 완료된 주문을 수신합니다. 사용자가 변경할 수있는 특정 위치의 모든 것.Firebase + Swift : removeAllObservers가 작동하지 않습니까?

내가 지금 사용하고 메커니즘은 이것이다 :

  1. 내 배열에 내가 주문을 보류중인 이벤트를 observe 전에 중포 기지는
  2. 를 참조 저장할 배열, 푸시 중포 기지의 참조를 만듭니다
  3. 완료된 주문에 대한 observe 이벤트가 있기 전에 해당 Firebase 참조를 내 배열로 밀어 넣으십시오.
  4. 사용자가 위치를 전환하면 내 배열의 모든 참조에 대한 모든 옵저버를 제거하십시오. 배열을 비우고 새 위치/완료된 주문을 보류중인 듣기 시작 (2 단계, 3)

내 코드는 다음과 같습니다

struct Firebase { 

    private let ORDERS_PATH = "locations-orders" 

    private static var references = [FIRDatabaseReference]() 

    static func observePendingOrders(lId: String, f: @escaping (AppState.Order) ->()) { 
    print("observing orders for \(ORDERS_PATH)/\(lId)") 

    let pendingOrdersReference = FIRDatabase.database().reference(withPath: "\(ORDERS_PATH)/\(lId)") 
    self.references.append(pendingOrdersReference) 

    pendingOrdersReference 
     .child(dateKeyToday()) 
     .queryOrdered(byChild: "created_at") 
     .observe(.childAdded, with: { firebaseSnapshot in 
     ... 

     print("order received for \(ORDERS_PATH)/\(lId)") 
     } 
    ) 
    } 

    static func fetchCompletedOrders(lId: String, f: @escaping ([AppState.Order]) ->()) { 
    print("observing completed orders for \(lId)") 

    let completedOrdersReference = FIRDatabase.database().reference(withPath: "\(ORDERS_PATH)/\(lId)") 
    self.references.append(completedOrdersReference) 

    completedOrdersReference 
     .child(dateKeyToday()) 
     .queryOrdered(byChild: "status_updated_at") 
     .observe(.value, with: { firebaseSnapshot in 
     ... 
     } 
    ) 
    } 

    static func removeAllOrderObservers() { 
    for reference in references { 
     print("removing reference \(reference)") 
     reference.removeAllObservers() 
    } 
    self.references = [] 
    } 

} 

그러나, 나는이 주문의 위치를 ​​로그인 할 때 내가 지켜보고있는 것처럼, 이전 관측통이 여전히 주문을 듣고있는 위치를 전환 한 후에도 마찬가지입니다.

observing orders for locations-orders/9RC4H9ZAE457E // first location 
observing completed orders for 9RC4H9ZAE457E 
removing reference https://mydb-123.firebaseio.com/locations-orders/9RC4H9ZAE457E // switch locations, remove all existing observers for location 9RC4H9ZAE457E 
removing reference https://mydb-123.firebaseio.com/locations-orders/9RC4H9ZAE457E 
observing orders for locations-orders/1JS53G0TT5ZQD // start listening for orders in new location. notice the new id: 1JS53G0TT5ZQD 
observing completed orders for 1JS53G0TT5ZQD 
order received for locations-orders/9RC4H9ZAE457E // <-- why is this still showing up? 
order received for locations-orders/1JS53G0TT5ZQD 
order received for locations-orders/1JS53G0TT5ZQD 
order received for locations-orders/9RC4H9ZAE457E // <-- and this one too?? 
order received for locations-orders/1JS53G0TT5ZQD 
order received for locations-orders/1JS53G0TT5ZQD 

=== 업데이트 === 심지어 핸들을 시도하고 작동하지 않았다 : 여기 내 로그입니다

struct Firebase { 

    private static var handles = [UInt]() 
    private static var references = [FIRDatabaseReference]() 

    static func observePendingOrders(lId: String, f: @escaping (AppState.Order) ->()) { 
    print("observing orders for \(ORDERS_PATH)/\(lId)") 

    let pendingOrdersReference = FIRDatabase.database().reference(withPath: "\(ORDERS_PATH)/\(lId)") 
    self.references.append(pendingOrdersReference) 

    let handle = pendingOrdersReference 
     .child(dateKeyToday()) 
     .queryOrdered(byChild: "created_at") 
     .observe(.childAdded, with: { firebaseSnapshot in 
     ... 
     } 
    ) 

    handles.append(handle) 
    } 

    static func fetchCompletedOrders(lId: String, f: @escaping ([AppState.Order]) ->()) { 
    print("observing completed orders for \(ORDERS_PATH)/\(lId)") 

    let completedOrdersReference = FIRDatabase.database().reference(withPath: "\(ORDERS_PATH)/\(lId)") 
    self.references.append(completedOrdersReference) 

    let handle = completedOrdersReference 
     .child(dateKeyToday()) 
     .queryOrdered(byChild: "status_updated_at") 
     .observe(.value, with: { firebaseSnapshot in 
     ... 
     } 
    ) 
    handles.append(handle) 
    } 

    static func removeAllOrderObservers() { 
// for reference in references { 
//  print("removing reference \(reference)") 
//  reference.removeAllObservers() 
// } 
//  
    if !references.isEmpty { 
     let ref = references[0] 
     for handle in handles { 
     print("removing handle \(handle)") 
     ref.removeObserver(withHandle: handle) 
     } 
     self.references = [] 
    } 
    } 
} 
+0

내 첫 번째 질문입니다; 왜 이런 짓을하는? 일단 관찰자를 추가하면 관측을 계속하고 관련 이벤트에 따라 폐쇄를 호출합니다. 배열에 대한 참조를 유지할 필요가 없습니다. 이 경우 Orders 노드에서 발생하는 모든 이벤트가 앱에 알립니다. – Jay

+0

안녕하세요. Jay. 앱은 다음과 같이 사용됩니다. 사용자가 위치를 선택하고 해당 위치의 모든 주문을 봅니다. 주문이 위치를 전환하면 이전 위치가 아닌 새로운 위치의 주문 만 표시됩니다. – Edmund

+0

동일한 위치에서 .childAdded 및 .value를 관찰하는 것처럼 보입니다. – Jay

답변

0

을 내가 그것을 해결 한 것 같아요? 그래서 저는 실제로 그 참조의 자식 노드를 관찰하고 있기 때문에 부모 노드에 대한 모든 관찰자를 제거하는 것은 관찰중인 특정 노드에서 제거해야하기 때문에 아무 것도하지 않습니다.

let pendingOrdersReference = FIRDatabase 
    .database() 
    .reference(withPath: "\(ORDERS_PATH)/\(lId)") 
    .child(dateKeyToday()) // <---- added this thing 

이 작동하는 것 같군 내 최종 솔루션입니다 :

struct Firebase { 
    private static var references = [FIRDatabaseReference]() 

    static func observePendingOrders(lId: String, f: @escaping (AppState.Order) ->()) { 
    print("observing orders for \(ORDERS_PATH)/\(lId)") 

    let pendingOrdersReference = FIRDatabase 
     .database() 
     .reference(withPath: "\(ORDERS_PATH)/\(lId)") 
     .child(dateKeyToday()) 
    self.references.append(pendingOrdersReference) 

    ... 
    } 

    static func fetchCompletedOrders(lId: String, f: @escaping ([AppState.Order]) ->()) { 
    print("observing completed orders for \(ORDERS_PATH)/\(lId)") 

    let completedOrdersReference = FIRDatabase 
     .database() 
     .reference(withPath: "\(ORDERS_PATH)/\(lId)") 
     .child(dateKeyToday()) 
    self.references.append(completedOrdersReference) 

    ... 

    } 

    static func removeAllOrderObservers() { 
    for reference in references { 
     print("removing reference \(reference)") 

     reference.removeAllObservers() 
    } 
    self.references = [] 
    } 

} 
관련 문제