我在网络数据库中有2000个位置,用户应该可以在地图上进行选择.我可以要求网络数据库只给出来自当前位置的一定数量的位置.
为了使一切顺利和优雅,我将首先实例化MKMapView,启动CLLocationManager并等待,直到我得到一个doUpdateLocations.然后我会尝试从一个数据库获取我的数据与完成处理程序.
我是不是该
a)立即获取所有数据
b)以小块或块获取数据?
最好的方法是什么?
func locationManager(manager: CLLocationManager,didUpdateLocations locations: [CLLocation]) { self.gotoCurrentLocation() if let userLocation = manager.location { GroundHelper.getAllGroundLocations(userLocation) { self.handleWaypoints($0!) } } } private func handleWaypoints(grounds: [Ground]) { mapView.addAnnotations(grounds) } // MARK: - Helper Methods typealias GPXCompletionHandler = ([Ground]?) -> Void class func getAllGroundLocations(userlocation: CLLocation,completionHandler: GPXCompletionHandler) { let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT dispatch_async(dispatch_get_global_queue(priority,0),{ ()->() in var results = RestApiManager.sharedInstance.getGPS(userlocation,limit: 50) // return first 50 results dispatch_async(dispatch_get_main_queue(),{ var grounds = [Ground]() for result in results { let (_,jsonGround) = result let ground = Ground(json:jsonGround) grounds.append(ground) } completionHandler(grounds) }) // get the rest results = RestApiManager.sharedInstance.getGPS(userlocation) // return them dispatch_async(dispatch_get_main_queue(),jsonGround) = result let ground = Ground(json:jsonGround) grounds.append(ground) } completionHandler(grounds) }) }) }
一次获取所有数据是不可扩展的.您可以使用2000个条目及时地进行工作,但是如果数据集增长如何?你能处理3000吗5000? 10000注解?
原文链接:https://www.f2er.com/swift/319713.html以块形式获取数据,仅返回地图所在位置附近的条目,并且随着用户在地图周围移动时显示这些条目更有意义.但是,这种方法非常慢,因为用户拖动地图和屏幕上出现的注释之间通常会有很长的延迟(网络请求本质上很慢).
因此,为了获得良好的用户体验,推荐的方法是在本地缓存结果.如果您有本地数据库(例如Core Data),或者您可以使用NSCache执行此操作,则可以执行此操作.
使用这种方法,当用户在地图上移动时,您将按照新的请求点击服务器,但返回的结果数量可以限制为20,50或100(某些可以让您获得最高数据量的响应).
接下来,您将从地图上的缓存结果中提取所有注释,因此注释数将随着用户在地图上移动而增加.
来自http://realm.io的这些人有一个非常漂亮的视频,解释了这种方法:https://www.youtube.com/watch?v=hNDNXECD84c虽然您不需要使用他们的移动数据库(Realm),您可以了解应用程序架构和设计的想法.