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];
}
}
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