2012-07-30 31 views
7

Vì không được gọi khi các ô được tải từ bộ nhớ cache, có cách nào để biết khi nào tất cả các ô đã được tải (từ bộ nhớ cache hoặc từ máy chủ ánh xạ) và hiển thị?Phát hiện khi các ô MapView được hiển thị

Có ủy quyền nào cho rằng gạch đã được tải không?

+2

Tôi đã nộp của Apple Bug # 13.774.496 liên quan đến điều này và tạo ra một ứng dụng ví dụ cho thấy vấn đề này vẫn còn tồn tại trên iOS6: https://github.com/iwasrobbed/MapKitDelegateBug – iwasrobbed

Trả lời

4

Dưới đây là một số mã nguồn tôi đã viết:https://github.com/jonathanlking/mapViewTest

Tại sao bạn không nghĩ về những vấn đề như thế này;

Khi chế độ xem bản đồ thay đổi, mapView:regionDidChangeAnimated: sẽ được gọi.

Từ đó mapViewWillStartLoadingMap: sẽ được gọi.

Tiếp theo mapViewDidFailLoadingMap:withError: hoặc mapViewDidFinishLoadingMap: sẽ được gọi nếu lát đã được tìm nạp từ máy chủ.

Tuy nhiên nếu không được gọi, bạn có thể giả định các ô đang được tải từ bộ nhớ cache.

+2

Cảm ơn, nhưng vẫn không có cách nào để biết khi nào chúng được hiển thị. –

+0

Chúng được hiển thị ngay lập tức - khi chúng được lưu trong bộ nhớ cache. –

+2

Xin lỗi, nhưng điều này không hoạt động. Tôi đã loại bỏ kết nối internet trên iPod Touch và phóng to đến mức không có ô đệm được lưu trong bộ nhớ cache và nó vẫn cho biết rằng bản đồ đã tải thành công (từ bộ nhớ cache trong ví dụ của bạn). Đây là một lỗi trên phần của Apple. – iwasrobbed

2

Như đã đề cập, mapViewDidFinishLoadingMap đôi khi không được gọi, đặc biệt là nếu các ô bản đồ đã được lưu trong bộ nhớ cache và đôi khi nó được gọi nhiều lần.

Tôi nhận thấy rằng khi được gọi nhiều lần tại lần gọi cuối cùng, tất cả các ô được hiển thị. Vì vậy, tôi nghĩ bạn có thể làm việc này nếu bạn thiết lập bộ hẹn giờ 2 giây sau khi bản đồ bắt đầu thay đổi. Tắt tương tác để bản đồ không tiếp tục thay đổi và cho phép tương tác của người dùng khi bộ hẹn giờ tắt.

Nếu mapViewDidFinishLoadingMap được gọi là đặt lại hẹn giờ lại trong 2 giây trong tương lai. Khi bộ hẹn giờ cuối cùng đã tắt, bạn sẽ có một bản đồ được hiển thị đầy đủ.

Bạn sẽ muốn xem xét các cuộc gọi lại khác như mapViewDidFailLoadingMap. Ngoài ra kiểm tra này trên một kết nối ồn ào, kể từ 2 giây có thể không đủ dài nếu phải mất một thời gian dài để lấy gạch.

- (void)restartTimer 
{ 
    [self.finishLoadingTimer invalidate]; 
    self.finishLoadingTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 
                   target:self 
                  selector:@selector(mapLoadingIsFinished) 
                  userInfo:nil 
                   repeats:NO]; 
} 

- (void)mapLoadingIsFinished 
{ 
    self.finishLoadingTimer = nil; 
    self.mapChanging = NO; 
    self.view.userInteractionEnabled = YES; 
} 

- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView 
{ 
    if (self.mapChanging) { 
     [self restartTimer]; 
    } 
} 

- (void)startLookingForMapChange 
{ 
    assert(self.mapChanging == NO); 
    if (self.mapChanging == NO) { 
     self.mapChanging = YES; 
     assert(self.finishLoadingTimer == nil); 
     self.view.userInteractionEnabled = NO; 
     [self restartTimer]; 
    } 
} 
+0

Tính năng này không hoạt động đối với trường hợp bạn đã mất kết nối internet để không thể tải thêm ô xếp. Nó vẫn gọi các đại biểu nói rằng bản đồ đã được nạp đầy đủ. – iwasrobbed

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