2016-09-03 32 views
0

我已經使用了火力地堡位置模塊Geofire到SEARCHQUERY我附近的某些位置。該查詢填充一個數組,然後應顯示在表上(通過表重新加載)。不幸的是,在tableview重新加載時,數組並沒有載入數據(count = 0)。 我正在使用異步回調(特別是在整個查詢完成後應該觸發的Geofire中的一個),但儘管我已閱讀了有關函數的內容,但似乎無法使其工作。下面是文檔:https://github.com/firebase/geofire-objc將數據加載到陣列

上我怎樣才能使這項工作順利進行而無需添加一個計時器,耽誤我重裝表的代碼有什麼建議?

下面是一些示例代碼:

var keyArray = [String]() 
let query = geoFireSearchQuery(someLocation) 

query.observeEventType(.KeyEntered, withBlock: { (key: String!, location: CLLocation!) in 

    keyArray.append(key) 

}) 

query.observeReadyWithBlock({ 

    self.tableView.reloadData()     

    self.geofireRef.removeAllObservers() 

}) 

我試圖通過可能的原因工作,利用各種測試中,我現在知道,這裏的問題是數據不加載到陣列快enough-我想用這種異步加載將工作,但我覺得我失去了一些東西(仍在學習)。

解決: 這是一個天生BAD的問題,應該是如何不問問題StackOverlow的一個例子。我不想讓這些細節陷入困境,那是一個錯誤。儘管缺乏信息,但是感謝大家的意見。

我遇到的問題是,我的陣列是這樣創建的: 查詢大型數據集,在陣列上運行的數據,存儲在大對象,存儲計算,那麼大的物體的排序陣列。重計算。

我哈克解決方案是使用keys.count爲多少對象將是最後的(大)陣列對於任何給定的查詢中的計數器。 然後我設置了一個「did Set」變量,每次添加大數組時都會觸發該變量。在Set Set中,我寫了一個簡單的if語句;

static var bigArray = [HugeObjects]() { 
     didSet { 
      if self.bigArray.count == self.keys.count { 
       tableView.reloadData() 
      } 
     } 

    } 

的缺點是didSet將觸發​​每一次的對象被添加到陣列中(30封頂雖然),但我不知道這將如何多大的影響性能。然而,解決方案的工作原理是,在bigArray完全寫入和排序之後,tableView現在會重新加載。

道歉壞的問題。

+0

呼叫tableView.reloadData內.KeyEntered可能? – Shubhank

+0

在KeyEntered中調用tableView.reloadData也不起作用。我嘗試了很多很多的組合,但我想我錯過了一些基本的技術或知識。 – Abhi

+0

是你的tableView無?您應該在numberOfRows方法中添加調試日誌 – Shubhank

回答

0

貌似self.geofireRef.removeAllObservers()是罪魁禍首。如果你刪除了觀察者,observeReadyWithBlock將永遠不會被調用。你不應該做

self.geofireRef.removeAllObservers() 

observeEventType

+0

它沒有工作(我重試了它,但我之前也嘗試過) - 爲了清楚起見,我已經編輯了這個問題。 – Abhi

+0

是query.observeEventType回調被調用? –

+0

是的,我用打印測試來檢查。數組是否可能太大而且需要大量的計算?當從Firebase加載數據時,回調觸發我懷疑由於數組爲零或一秒爲零。 – Abhi