2015-02-08 13 views
7

Tôi muốn tạo một hàm để kiểm tra xem user_id đã có trong cơ sở dữ liệu của tôi chưa.Swift có thể trả về giá trị từ khối Void-return không đồng bộ không?

class func checkIfUserExsits(uid:String) -> Bool { 
    userRef.childByAppendingPath(uid).observeSingleEventOfType(.Value, withBlock: { (snapShot: FDataSnapshot!) -> Void in 
       if snapShot.value is NSNull { 
        return false 
       } else { 
        return true 
       } 
    }) 
} 

Tuy nhiên, observeSingleEventOfType là API do Firebase của bên thứ ba cung cấp. Nó được xác định để trả lại Void.

  • (void)observeSingleEventOfType:(FEventType)eventType withBlock:(void (^) (FDataSnapshot *snapshot))block

Lỗi: Type 'Void' does not conform to protocol 'BooleanLiteralConvertible'

Đánh giá cao bất kỳ loại giúp.


CẬP NHẬT

tôi đang cố gắng một cách khác nhau:

class func checkIfExist(uid: String) -> Bool { 
    var answer:Bool = false 
    var text:String = "not yet completed" 
    let queue = dispatch_group_create() 
    dispatch_group_enter(queue) 
     userRef.childByAppendingPath(uid).observeSingleEventOfType(.Value, withBlock: { (snapShot: FDataSnapshot!) -> Void in 
       if snapShot.value is NSNull { 
        text = "This is a new user" 
        answer = false 
        dispatch_group_leave(queue) 
       } else { 
        text = "Found the user in Firebase" 
        answer = true 
        dispatch_group_leave(queue) 
       } 
     }) 
    dispatch_group_wait(queue, DISPATCH_TIME_FOREVER) 
    println(text) 
    return answer 
} 

Bằng cách nào đó nó chỉ đóng băng ở đó. Tôi biết cách tiếp cận này có thể không có chủ đề ngay bây giờ. Nhưng xin vui lòng giúp đỡ.

Trả lời

14

Bạn nên sử dụng bộ xử lý hoàn thành đồng bộ tự hỏi:

class func checkIfUserExists(uid: String, completionHandler: (Bool) ->()) { 
    userRef.childByAppendingPath(uid).observeSingleEventOfType(.Value) { snapShot in 
     if snapShot.value is NSNull { 
      completionHandler(false) 
     } else { 
      completionHandler(true) 
     } 
    } 
} 

Sau đó, bạn có thể gọi đây là như vậy:

MyClass.checkIfUserExists(uid) { success in 
    // use success here 
} 

// but not here 

Trong câu hỏi sửa đổi của bạn, bạn chứng minh việc sử dụng các nhóm công văn đến làm cho phương thức không đồng bộ này hoạt động đồng bộ. (Semaphores cũng thường được sử dụng cho đến tận cùng.)

Hai vấn đề:

  1. này sẽ bế tắc nếu họ cử xử lý hoàn thành của họ trở lại vào hàng đợi chính (và trong nhiều trường hợp, thư viện sẽ làm điều này để đơn giản hóa cuộc sống cho chúng tôi), bởi vì bạn đang tình cờ chặn cùng một chuỗi họ đang cố gắng sử dụng. Tôi không biết nếu đó là những gì họ đã làm ở đây, nhưng có khả năng.

    Nếu bạn muốn xác nhận điều này, hãy tạm thời xóa nhóm công văn và sau đó kiểm tra NSThread.isMainThread và xem nó có đang chạy trong luồng chính hay không.

  2. Bạn chưa bao giờ nên chặn luồng chính. Họ cung cấp một giao diện không đồng bộ vì lý do chính đáng, vì vậy bạn nên sử dụng các mẫu không đồng bộ khi gọi nó. Không chống lại các mẫu không đồng bộ, mà là ôm lấy chúng.

+0

Cảm ơn. Tôi tự hỏi liệu có cách nào khác tiết kiệm hơn không. Tôi không thích dự án của tôi được lồng trong các khối hoàn chỉnh bên trong các khối hoàn chỉnh. –

+0

Cảm ơn bạn rất nhiều Rob. Tôi biết tôi có thể làm điều đó theo một cách rất sai, nhưng tôi vẫn muốn thử. Như bạn đã nói, tôi đang cố gắng không đồng bộ hóa tính năng này. Tôi không quen thuộc với semaphores. Tôi đã cố gắng sử dụng dispactch_group_wait thay thế. Vui lòng xem cập nhật câu hỏi của tôi. –

+3

Nếu họ gửi trình xử lý hoàn thành của họ trở lại hàng đợi chính (và trong nhiều trường hợp, thư viện sẽ làm điều này để đơn giản hóa cuộc sống cho chúng tôi), bạn sẽ bế tắc, chặn luồng chính, chờ thư viện gửi trình xử lý hoàn thành tới cùng một chuỗi bạn đang chặn. Tôi không biết nếu đó là những gì họ đã làm ở đây, nhưng có khả năng. Tạm thời loại bỏ nhóm công văn và sau đó kiểm tra 'NSThread.isMainThread' nếu bạn muốn xác nhận. Nhưng, một lần nữa, tôi sẽ cố gắng hơn để chống lại việc chặn luồng chính đơn giản bởi vì bạn ít thoải mái hơn khi sử dụng các bao đóng và các mẫu không đồng bộ. – Rob

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