2017-07-13 32 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