2016-04-11 19 views
11

Tôi có người quan sát toàn cầu trong ViewController và cần một số người quan sát khác nhau bên trong nó cho các giá trị cụ thể như dưới đây. Có thể loại bỏ người quan sát sau khi thay đổi giá trị một lần không?Xóa người quan sát sau khi thay đổi giá trị trong Firebase

var ref = Firebase(url: "https://<FIREBASE-APP>.firebaseio.com/") 

let handle = ref.observeEventType(.Value, withBlock: { snapshot in 

    //Here VALUE Changes to NEW_VALUE 
    if snapshot.value as! String == NEW_VALUE { 

     //IS IT POSSIBLE TO REMOVE HANDLE HERE???? 
     ...something here 
    } 

}) 

//NOT HERE 
...ref.removeObserverWithHandle(handle) 
+0

ref.observeSingleEventOfType? – mrkbxt

+0

observSingleEventOfType chỉ quan sát một lần, giống như một truy vấn còn lại và sau đó tự xóa chính nó. Tôi cần quan sát giá trị luôn, cho đến khi nó thay đổi và sau đó loại bỏ nó –

+0

Bạn có thể làm rõ; các nhà quan sát khác nhau cho các giá trị cụ thể? Trong câu hỏi, bạn đang quan sát bởi .value, toàn bộ nút ứng dụng của bạn sẽ kích hoạt mọi chỉnh sửa hoặc xóa sự kiện ở bất kỳ đâu trong nút đó. Nếu có thay đổi, ảnh chụp sẽ trả về * mọi thứ * (tất cả các nút con, con cái của chúng, v.v.) bên trong nút đó, không thể so sánh với một chuỗi. ngay cả khi nó có thể tuy nhiên, nếu bạn loại bỏ các xử lý, các nút ứng dụng sẽ không còn được quan sát cho bất kỳ thay đổi. Bạn có thể tinh chỉnh câu hỏi của bạn được không? – Jay

Trả lời

24

Đây là một trong những trường hợp bạn cần phải thực hiện thêm một bước trong Swift, vì nó không nhận ra rằng bạn có thể yên tâm truy cập handle bên trong khối.

Một cách để làm việc xung quanh này là:

let ref = Firebase(url: "https://yours.firebaseio.com/") 
var handle: UInt = 0 
handle = ref.observeEventType(.Value, withBlock: { snapshot in 
    print(snapshot) 
    if snapshot.exists() && snapshot.value as! String == "42" { 
     print("The value is now 42") 
     ref.removeObserverWithHandle(handle) 
    } 
}) 

Bằng cách khởi tạo một cách rõ ràng biến handle, chúng tôi loại bỏ các lỗi từ trình biên dịch Swift. Nhưng cho rằng tay cầm sẽ được đặt trước khi khối của chúng ta được gọi, chúng ta có thể gọi một cách an toàn ref.removeObserverWithHandle(handle) bên trong khối.

+0

Đây chính xác là những gì tôi cần, Cảm ơn bạn Frank !!!! –

+1

Giá trị sẽ gây ra vấn đề vì nó sẽ trả về tất cả các giá trị với nút , mà sẽ là một cấu trúc từ điển mà không thể so sánh với một chuỗi.Có lẽ là một đứa trẻ trong snapshot.children sẽ làm điều đó.Ngoài ra, không cần phải xử lý ở tất cả trong đó nếu chúng ta muốn quan sát một thay đổi, chỉ cần làm ref. removeAllObservers bên trong khối. :-) – Jay

+0

Điểm tốt về cấu trúc @Jay. Nhưng tôi không đồng ý với việc gọi 'ref.removeAllObservers()'. Điều đó sẽ (như tên gọi) loại bỏ * tất cả * quan sát viên, mà không giống nhau. Mặc dù nó có thể làm việc cho đoạn mã đơn giản này, nói chung tôi muốn có một sự đối xứng giữa việc thêm người nghe và loại bỏ chúng, –

Các vấn đề liên quan