UPDATEMKMapView ładuje wszystkie widoki adnotacji naraz (w tym tych, które są poza obecnym rect)
Wygląda jak ten problem został rozwiązany w spokojnej iOS 4.3. Do tego momentu dystans, który uważano za "wystarczająco duży", aby anotacja mogła zostać poddana recyklingowi, wydawała się być setkami mil, nawet przy bardzo dużym zbliżeniu. Gdy buduję swoją aplikację za pomocą pakietu SDK iOS 4.3, adnotacje są przetwarzane w oparciu o bardziej uzasadnione limity.
Czy ktoś inny napotkał ten problem? Oto kod:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(WWMapAnnotation *)annotation {
// Only return an Annotation view for the placemarks. Ignore for the current location--the iPhone SDK will place a blue ball there.
NSLog(@"Request for annotation view");
if ([annotation isKindOfClass:[WWMapAnnotation class]]){
MKPinAnnotationView *browse_map_annot_view = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"BrowseMapAnnot"];
if (!browse_map_annot_view) {
browse_map_annot_view = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"BrowseMapAnnot"] autorelease];
NSLog(@"Creating new annotation view");
} else {
NSLog(@"Recycling annotation view");
browse_map_annot_view.annotation = annotation;
}
...
Gdy zostanie wyświetlony widok, mam
2009-08-05 13:12:03.332 xxx[24308:20b] Request for annotation view
2009-08-05 13:12:03.333 xxx[24308:20b] Creating new annotation view
2009-08-05 13:12:03.333 xxx[24308:20b] Request for annotation view
2009-08-05 13:12:03.333 xxx[24308:20b] Creating new annotation view
i dalej i dalej, za każdym adnotacji (~ 60) Mam dodany. Mapa (poprawnie) wyświetla tylko dwie adnotacje w bieżącym rect. Ja ustawienie regionu w viewDidLoad:
if (center_point.latitude == 0) {
center_point.latitude = 35.785098;
center_point.longitude = -78.669899;
}
if (map_span.latitudeDelta == 0) {
map_span.latitudeDelta = .001;
map_span.longitudeDelta = .001;
}
map_region.center = center_point;
map_region.span = map_span;
NSLog(@"Setting initial map center and region");
[browse_map_view setRegion:map_region animated:NO];
Wpis dziennika dla regionu jest ustawiony zostanie wydrukowany do konsoli zanim jakiekolwiek widoki adnotacji są wymagane.
Problem polega na tym, że ponieważ wszystkie adnotacje są żądane natychmiast, [mapView dequeueReusableAnnotationViewWithIdentifier] nic nie robi, ponieważ istnieją unikalne MKAnnotationViews dla każdej adnotacji na mapie. To prowadzi do problemów z pamięcią.
Jednym z możliwych problemów jest to, że te adnotacje są skupione w dość małej przestrzeni (promień ~ 1 mile). Chociaż mapa jest bardzo przybliżona w viewDidLoad (szerokość i długość geograficzna delta .001), wciąż ładuje wszystkie widoki adnotacji naraz.
Dzięki ...
To jest świetna odpowiedź. Przeczytałem dokumentację, ale domyślam się, że zostałem rzucony przez projekt, który brzmiał zgodnie z odplamianiem komórek tabeli. W przypadku komórek tabeli wygląda na to, że ograniczają one rozmiar kolejki, a następnie zaczynają zwalniać komórki tabeli (nie sprawdziłem jednak z debuggerem). To dziwne, że dequeing na mapie nie jest zgodny z tym. Zastanawiam się, dlaczego, gdy logika utrzymywania listy markerów znajdujących się wewnątrz i na zewnątrz bieżącego regionu już istnieje w klasie, programista powinien ją skopiować, aby uzyskać jakiekolwiek rzeczywiste oszczędności w pamięci. Dzięki!! – jmans
Hum, tak, masz rację, to dziwne, ponieważ nazwa jest naprawdę podobna do tej dla UITableView i jak powiedziałeś, słowo "poza ekranem" pozwala użytkownikowi myśleć, że powinno działać jak UITableView. I masz rację, myślę, że jeśli tworzysz widok tabeli z rozmiarem sekcji 10000, nigdy nie otrzymasz 10000 UITableViewCellView utworzonego, ponieważ większość z nich jest ponownie wykorzystywana. dalszy pomysł: kiedy ustawiasz adnotacje w swoim kodzie? Czy jesteś w 100% pewien, że zostanie wywołany po ustawieniu wartości regionu? – yonel
Nie jestem w 100% pewny, ale nie będę miał szansy zadzwonić z moim kodem ponownie do czwartku. Przyjrzę się wtedy jeszcze raz, mając na uwadze twoją radę i dam ci znać, co się stanie. – jmans