2012-12-05 11 views
5

Dobry dzień wszystkim!Jak renderować MKMapView poza głównym wątkiem?

Zajmuję się tworzeniem aplikacji na iPhone'a. Mam widok tabeli i listę lokalizacji, które muszę wyświetlić użytkownikowi. W tym celu użyłem MKMapView w każdej komórce widoku tabeli. Ale gdy jest wiele lokalizacji, to rozwiązanie staje się bardzo powolne. Chcę poprawić wydajność interfejsu użytkownika i zamienić MKMapView na UIImageView. Więc muszę renderować mapę z MKMapView do UIImage w jakimś wątku NON-MAIN. Próbowałem zrobić to tak:

UIGraphicsBeginImageContext(CGSizeMake(64, 64)); 
CGContextRef context = UIGraphicsGetCurrentContext(); 
[[mapView layer] renderInContext:context]; 
thumbnail_image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Ale ten kod renderuje tylko żółte tło mapy i pin powyżej określonej lokalizacji. Nie ma danych map takich jak ulice, domy itp. Co zrobiłem źle? Dziękuję za radę.

Odpowiedz

3

Powodem braku danych mapy jest brak czekania na wczytanie danych mapy. Poczekaj, aż zostanie wywołana metoda delegata z widoku mapy mapViewDidFinishLoadingMap:, a następnie zrób zdjęcie. Być może będziesz musiał wykonać zdjęcie po niewielkim opóźnieniu, jednej lub dwóch sekund po wywołaniu metody delegatów, ponieważ odkryłem, że czasami metoda delegata jest nazywana nieco wcześniej, jak wspomnę w this question.

- (void)mapViewDidFinishLoadingMap:(MKMapView*)mapView { 
    double delayInSeconds = 2.0; 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
     UIGraphicsBeginImageContext(CGSizeMake(64, 64)); 
     CGContextRef context = UIGraphicsGetCurrentContext(); 
     [mapView.layer renderInContext:context]; 
     thumbnail_image = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 
    }); 
} 

Uwaga: Będziemy chcieli, aby wymiary swojego widoku mapy kwadratu tak, że kiedy czynią to w kwadratowy obrazu nie zostanie rozciągnięta niezręcznie.

+0

Problem polega na tym, że ta metoda delegatów nigdy nie została wywołana. Nie wiem, jak wymusić mapę obciążenia. Prawdę mówiąc, używam Monotoucha i być może jest to błąd tej platformy. –

+0

Przeprowadziłem eksperyment. Opisana metoda delegata jest wywoływana poprawnie tylko wtedy, gdy dodany jest MKMapView do przeglądania za pomocą funkcji AddSubview(). –

+0

Prawidłowo. Widok mapy nie będzie próbował załadować kafelków obrazu/mapy, dopóki nie stanie się częścią hierarchii widoku. –

Powiązane problemy