swift – 如何从Webserver最佳地加载MapView的位置

前端之家收集整理的这篇文章主要介绍了swift – 如何从Webserver最佳地加载MapView的位置前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在网络数据库中有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注解?

以块形式获取数据,仅返回地图所在位置附近的条目,并且随着用户在地图周围移动时显示这些条目更有意义.但是,这种方法非常慢,因为用户拖动地图和屏幕上出现的注释之间通常会有很长的延迟(网络请求本质上很慢).

因此,为了获得良好的用户体验,推荐的方法是在本地缓存结果.如果您有本地数据库(例如Core Data),或者您可以使用NSCache执行此操作,则可以执行此操作.

使用这种方法,当用户在地图上移动时,您将按照新的请求点击服务器,但返回的结果数量可以限制为20,50或100(某些可以让您获得最高数据量的响应).

接下来,您将从地图上的缓存结果中提取所有注释,因此注释数将随着用户在地图上移动而增加.

来自http://realm.io的这些人有一个非常漂亮的视频,解释了这种方法https://www.youtube.com/watch?v=hNDNXECD84c虽然您不需要使用他们的移动数据库(Realm),您可以了解应用程序架构和设计的想法.

原文链接:https://www.f2er.com/swift/319713.html

猜你在找的Swift相关文章