2015-10-03 18 views
13

Tôi có 2000 vị trí trong cơ sở dữ liệu web mà người dùng có thể chọn trên Bản đồ. Tôi có thể yêu cầu cơ sở dữ liệu web chỉ cung cấp cho tôi một số vị trí nhất định bắt nguồn từ vị trí hiện tại.Cách tải vị trí tốt nhất cho MapView từ Webserver

Để làm cho mọi thứ mượt mà và thanh lịch, trước tiên tôi sẽ khởi tạo MKMapView, bắt đầu CLLocationManager và đợi cho đến khi tôi nhận được một didUpdateLocations. Sau đó, tôi sẽ cố gắng để có được dữ liệu của tôi từ một cơ sở dữ liệu với một xử lý hoàn thành.

Tôi có nên

a) có được tất cả dữ liệu cùng một lúc

b) lấy dữ liệu trong mảnh nhỏ hoặc khối?

Cách tốt nhất là gì?

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(), { 

      var grounds = [Ground]() 
      for result in results { 
       let (_,jsonGround) = result 
       let ground = Ground(json:jsonGround) 
       grounds.append(ground) 
      } 
      completionHandler(grounds) 

     }) 
    }) 
} 
+0

Đây có phải là điều một lần không? Nói cách khác, bạn sẽ lưu trữ tất cả nội dung đó ngay sau lần đầu tiên ứng dụng tải chứ? –

Trả lời

0

Trước hết, bạn nên nghĩ rằng nếu 2000 chú thích sẽ khớp với cùng một lúc trên MKMapView. Có lẽ bạn nên cố gắng chỉ khôi phục các vị trí phù hợp với bản đồ bạn đang trình bày.

Sau đó, trong mã của bạn, bạn đang thêm chú thích mọi lúc didUpdateLocations được gọi. ¿Bạn có xóa các chú thích cũ ở bất kỳ nơi nào khác không ?. Nếu các chú thích không thay đổi và trên bản đồ, bạn không nên thêm chúng nữa.

Tôi nghĩ rằng một cách tiếp cận tốt nên là:

1. Lần đầu tiên didUpdateLocations được gọi là: yêu cầu dịch vụ web của bạn cho các chú thích phù hợp trong một khoảng cách tương đương với hai lần khu vực đó là hiển thị bản đồ của bạn. Lưu vị trí đó dưới dạng locationOrigin, lưu khoảng cách đó là distanceOrigin

2.- Thời gian tiếp theo didUpdateLocations được gọi là: Nếu khoảng cách di chuyển từ vị trí hiện tại đến vị tríOrigin bằng một nửa khoảng cáchOrigin. Bạn nên truy vấn lại dịch vụ web, cập nhật biến 'Gốc' và chỉ thêm chú thích mới vào mapView.

3.- Nếu regionWillChange được gọi là (MKMapViewDelegate): người dùng đang phóng to, di chuyển bản đồ hoặc xoay thiết bị .... cách tiếp cận đơn giản là tải lại chú thích như thể chúng tôi đang ở bước 1. Một thông minh hơn phương pháp tiếp cận là thêm trình nhận dạng cử chỉ để phát hiện xem người dùng có đang phóng to hay không (hoặc trong trường hợp đó chú thích không thay đổi) hoặc thu nhỏ hoặc di chuyển (chú thích có thể thay đổi)

+0

2000 chú thích là tốt. Giống như với UITableView. Bản đồ sẽ không lãng phí các chu kỳ xử lý các chú thích hiện không hiển thị. –

+0

@DanielT. Tôi đã không suy nghĩ trong việc thực hiện MapView, tôi đã suy nghĩ về hiệu suất mạng. Có lẽ anh ta không cần phải phục hồi 2000 địa điểm nếu anh ta chỉ hiển thị 50. BTW Thật tuyệt khi biết rằng bạn có thể có một bản đồ với hơn 7000 chú thích. – gabuh

2

Bắt tất cả dữ liệu cùng một lúc không thể mở rộng. Bạn có thể làm cho nó hoạt động đúng lúc với 2000 mục, nhưng nếu tập dữ liệu phát triển thì sao? Bạn có thể xử lý 3000? 5000? 10.000 chú thích?

Lấy dữ liệu của bạn theo khối, chỉ trả lại các mục gần vị trí mà bản đồ được căn giữa và hiển thị các mục nhập đó khi người dùng di chuyển quanh bản đồ có ý nghĩa hơn. Tuy nhiên, cách tiếp cận này rất chậm, vì thường có sự chậm trễ lâu giữa người dùng kéo bản đồ và các chú thích xuất hiện trên màn hình (yêu cầu mạng chậm trong tự nhiên).

Do đó, cách tiếp cận được khuyến nghị cho trải nghiệm người dùng tuyệt vời là lưu vào bộ nhớ cache kết quả cục bộ. Bạn có thể thực hiện việc này nếu bạn có cơ sở dữ liệu cục bộ (ví dụ: Dữ liệu cốt lõi) hoặc bạn có thể thực hiện việc này với NSCache.

Với phương pháp này, bạn sẽ nhấn máy chủ với các yêu cầu mới khi người dùng di chuyển xung quanh bản đồ, nhưng số lượng kết quả trả lại có thể bị giới hạn ở 20, 50 hoặc 100 (thứ gì đó mang lại cho bạn số lượng dữ liệu cao nhất trong khi rất nhạy).

Tiếp theo, bạn sẽ hiển thị tất cả các chú thích từ kết quả được lưu trong bộ nhớ cache trên bản đồ, vì vậy số lượng chú thích sẽ tăng khi người dùng di chuyển xung quanh bản đồ.

Những người từ http://realm.io có một video khá hay giải thích cách tiếp cận này: https://www.youtube.com/watch?v=hNDNXECD84c Trong khi bạn không cần sử dụng cơ sở dữ liệu di động của họ (Realm), bạn có thể có ý tưởng về kiến ​​trúc và thiết kế ứng dụng.

0

Tải chúng theo khối gần vị trí người dùng hiện tại, nếu người dùng thu nhỏ tải một đoạn khác, nếu người dùng di chuyển bản đồ tải một đoạn khác và cứ tiếp tục như vậy. theo cách này, ứng dụng của bạn sẽ mở rộng tốt hơn nếu chú thích của bạn ngày càng trở nên giống như chú thích 1 triệu.

0

Tôi đã thực sự viết một ứng dụng có thể đặt 7000 chú thích trên MKMapView mà không gặp vấn đề về hiệu năng ... và trên iPad 1. Bạn thực sự không cần lo lắng về bản đồ.

Yếu tố hạn chế duy nhất tôi có thể nghĩ là cuộc gọi mạng sẽ mất bao lâu và liệu đó có phải là vấn đề hay không. Trong trường hợp của tôi, tôi đã kéo địa chỉ ra khỏi cơ sở dữ liệu danh bạ, mã hóa địa lý và lưu trữ các thời gian chờ trong dữ liệu chính. Có địa chỉ 7000 địa lý mất mãi mãi, nhưng một khi bạn có lat-longs đặt chúng trên bản đồ là công cụ dễ dàng và mã bản đồ có thể xử lý nó chỉ ...

Các vấn đề liên quan