2017-07-13 33 views
1

我正在使用解析版本「1.14.4」iOS 10.3.2和swift 3. 無論本地(他返回的對象是固定的)還是遠程的,查詢都很慢。 由於基於緩慢的數據返回解析iOS swift 3.

let placeObject = PFObject(className:"PlaceObject") 
let point = PFGeoPoint(latitude:self.PointGlobal.latitude, longitude:self.PointGlobal.longitude) 
placeObject["location"] = point 
let query = PFQuery(className:"CLocationObject") 
// Interested in locations near user. 
query.whereKey("location", nearGeoPoint:point) 
// Limit what could be a lot of points. 
query.limit = 200 
let localQuery = (query.copy() as! PFQuery).fromLocalDatastore() 

localQuery.findObjectsInBackground{ 
    (objects: [PFObject]?, error: Error?) -> Void in 

self.dataReturnedLocally = true 

..... 

if self.dataReturnedLocally{ 
print("local query with no error there was data already") 
} 

    else { 
    print("getting data remotely") 
    query.findObjectsInBackground{ 
    (objects: [PFObject]?, error: Error?) -> Void in 
    if error == nil { 

     if let objects = objects { 

回答

1

地理查詢是最慢的類型與MongoDB中查詢的,很遺憾。此外,不會自動根據位置進行索引,這使得這些特別慢,特別是對於大型集合。因此,您唯一真正的解決方案就是將索引添加到數據庫中,以便爲位置索引編制索引,並針對您需要進行的位置查詢進行優化。儘管記住太多這些影響寫入速度。

根據您的使用情況,最好使用withinMiles而不是nearGeoPoint。這將返回更少的結果,但不會花費太長時間來運行。

+0

謝謝傑克,但本地查詢也很慢。在這種情況下,這應該與MongoDB無關。 – user2867432

+0

基於地理位置的查詢將成爲本地最慢的查詢類型,不幸的是我不認爲你能夠進入本地數據存儲的本質。我不知道你可以用這個做任何索引。所以,你最好的選擇就是再次將它改成內置而不是在附近。沒有其他的事情要做。 –

+0

謝謝傑克,但在我的情況下,它不會有什麼不同,因爲它會返回相同數量的數據點。你知道一種技術,我們可以在Parse中查詢以前沒有返回的數據嗎? – user2867432

1

LDS中的所有查詢都很慢,因爲它們沒有編入索引。 LDS存儲數據的objectId/JSON表示,並且所有過濾都在內存中完成。

+0

當你說全部時,你的意思是所有Parse LDS? – user2867432

+0

我的意思是每當你對LDS進行查詢時,查詢過濾在內存中完成 – flovilmart

+0

好的。因此,無論使用LDS還是遠程,整體查詢速度都很慢?你會推薦連續較小的查詢嗎?如果是的話,你將如何實現這樣的事情:查詢1然後查詢2將不是查詢1中的結果?謝謝 – user2867432