2015-09-22 35 views
0

我正在使用Parse的PFUser和PFRole類。現在我需要在UITableView中列出具有特定角色的用戶,這似乎是一個相當簡單的任務。如何設置PFQuery以使用queryForTable獲取給定角色的所有用戶?

所以我創建了一個PFQueryTableViewController和覆蓋queryForTable()其內部的我試着先拿到角色,那麼它的用戶:

override func queryForTable() -> PFQuery { 
    let roleQuery: PFQuery? = PFRole.query() 
    roleQuery!.whereKey("name", equalTo: "admin") 

    var userQuery: PFQuery? 

    roleQuery!.getFirstObjectInBackgroundWithBlock { 
     (object: PFObject?, error: NSError?) -> Void in 

     if error == nil { 
      let role: PFRole? = object as? PFRole 
      let relation: PFRelation? = role!.relationForKey("users") 

      userQuery = relation!.query() 
     } 
    } 

    return userQuery! 
} 

但由於getFirstObjectInBackgroundWithBlock()是異步的,這是應該的查詢是返回總是零。我也嘗試過getFirstObject(),它是同步的,但在這種情況下,我得到以下警告:正在主線程上執行長時間運行的操作。

我敢肯定,必須有一個簡單的方法來設置此查詢...有沒有人有想法?先謝謝你!

大衛

+0

首先運行角色查詢,然後在準備就緒時加載表,以便創建查詢所需的所有詳細信息。 – Wain

+0

Hi @Wain,感謝您的快速回答。你將如何運行角色查詢_then_加載表?我試圖在init()方法中運行它,但出現以下錯誤:_類PFRole必須在使用Parse_之前使用registerSubclass註冊。 – davidg

+0

這是你的根視圖控制器嗎?最好在前一個屏幕上獲得角色並將其傳入,如果需要,可以爲此添加新的啓動屏幕。 – Wain

回答

0

我已經受夠了解析和異步查詢類似的問題,我已經不同解決它。 您可以在調用視圖控制器中的下載功能的函數中使用閉包。 例如當你開始下載數據,顯示在您的表視圖一個活動的指標,並在情況下,搜索已經結束,並已成功在

if error == nil { //here you can populate your table in your view by using a closure function } 

這裏是一個文檔的鏈接瞭解如何使用閉包: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID103

+0

嗨@謝林,謝謝你的回答。問題是,queryForTable()本身不應該執行查詢,而只是「構建」並返回它... – davidg

+0

好吧,那麼當你得到查詢時你想如何繼續?你想做其他事情,然後將你從查詢中得到的數據加載到表中?你的視圖控制器中有一個你想綁定查詢的變量嗎? – Shelin

+0

Hi @Shelin:據我所知,當使用PFQueryTableViewController時,你不能顯式地執行查詢...你只需使用'queryForTable()'方法指定它,然後控制器就可以在需要時使用它從Parse中獲取數據。所以,在查詢運行之前,我看不到如何「做其他事情」。 – davidg

相關問題