2017-04-19 43 views
2

當觀察FIRDatabaseQuery與觀察方法,有時需要10〜13秒從遠程數據庫獲取數據。這主要發生在應用程序來自後臺或剛剛啓動時。此查詢完成後,隨後的查詢將以遠程數據的超快速度返回。並且問題不再發生。火力地堡數據庫慢速觀察

這是我使用觀察代碼:

public static func observeMatchEvents(match: Match) -> QueryObserver 
{ 
    FIRDatabase.database().reference().child("events").queryOrdered(byChild: "match_id").queryEqual(toValue: match.identifier) 

    log.debug("Started getting match events...") 
    let observer = query.observe(FIRDataEventType.value, with: { (snapshot) in 
     log.debug("This sometimes takes 10~13 seconds before it gets executed") 
    // Handle data 
    }) 

    return QueryObserver(query: query, handle: observer) 
} 

這是我在我的火力地堡數據庫結構:

Firebase Database Structure

,事件是根的孩子數據庫。

我使用火力地堡規則的文檔中描述,以提高索引:

我想這個事做具有在啓動時打開插座。然而10〜13秒需要很長的時間。有沒有人遇到過這種行爲,有人有一個想法來加快這一點?

編輯: 所以想貼在這裏的建議,並嘗試其他的事情後,我終於找到了解決辦法。實際上有兩個問題:

1)當我開始在同一時間觀測過查詢的放緩發生。由於數據量非常大,因此需要很長時間才能完成這些觀察呼叫。這在timeprofiler中也是可見的,你會發現此時的CPU負載非常巨大。

2)我發現更麻煩的是設置FIRDatabase.database()。persistenceEnabled = true顯着增加了查詢的回調時間。在全新安裝應用程序並從Firebase獲取數據時,速度非常快。但是響應時間會增加每次的火力地堡數據庫會寫更多的數據到磁盤,這是在每個請求10毫秒增加。這樣,應用程序最終需要10秒才能完成對數據庫的請求。我們注意到我們的Android應用程序也有同樣的行爲。這裏唯一的解決方案是完全禁用數據庫的持久性。根據數據庫的大小

回答

2

這樣的搜索將是緩慢的。理想情況下,你會在數據庫中創建不同的節點,其中關鍵是match_id,然後它會快速搜索。事情是這樣的:

{ 
    "matches": { 
     "vodiudtnlmdrjiqhkkdowc15": { 
      "subvodiudtnlmdrjiqhkkdowc156hii1jc7phspraa81xp9kuj85ezviixcyaaj162saxs2yl127s9": true 
     } 
    } 
} 

然後你就可以查詢:

.child('matches').child(match.identifier) 

這將讓你有一個匹配ID的所有事件。一旦你有了,你可以遍歷這些並直接獲取單個記錄。爲了使這些數據保持最新,請查看Firebase功能或推出自己的功能。

這將會非常快,因爲它根本不需要進行搜索。

+0

感謝您的回答。看到這是一款製作應用程序,它有點難以改變,但我會研究它。你有一個想法,爲什麼最初的搜索可能會很慢,但隨後的搜索真的很快?如果這會是一個問題,我希望所有的搜索都很慢。 –

+0

也許它是索引?不確定。 –

1

由於您認爲這種減速只發生在應用程序變爲活動狀態時的初始查詢中,因此很可能是由Firebase客戶端連接到其服務器引起的。

很少有您的應用程序代碼,Firebase客戶端或Firebase服務器可以做到這一點。但是您可以深入瞭解enabling debug logging發生的情況,並在初始連接時研究輸出。

+0

我假設在AppDelegate中設置'FIRDatabase.setLoggingEnabled(true)'就足夠了,它應該在控制檯中生成日誌。我在Xcode 8.3.1和Swift中使用sdk版本'3.1.2',但它不起作用。 – Pahnev