2011-01-23 17 views
10

मेरे पास एक बड़ी मात्रा में एनोटेशन (3000+) के साथ नक्शा दृश्य है, जब उपयोगकर्ता उचित स्तर पर ज़ूम किया जाता है तो सभी ठीक और तेज़ होते हैं।बड़ी मात्रा में MKMapView एनोटेशन

हालांकि जब उपयोगकर्ता ज़ूम आउट करता है और एनोटेशन की एक बड़ी मात्रा में देखा जाता है तो एक बार में दिखाए जाने वाले एनोटेशन की भारी राशि के कारण बहुत धीमी गति होती है। इसे संभालने का सबसे अच्छा तरीका क्या है?

वर्तमान समाधान मैं उपयोग कर रहा हूँ:

- (void)mapView:(MKMapView *)_mapView regionDidChangeAnimated:(BOOL)animated { 

    NSArray *annotations = [_mapView annotations]; 
    MapAnnotation *annotation = nil; 

    for (int i=0; i<[annotations count]; i++) 
    { 
     annotation = (MapAnnotation*)[annotations objectAtIndex:i]; 
     if (_mapView.region.span.latitudeDelta > .010) 
     { 
      [[_mapView viewForAnnotation:annotation] setHidden:YES]; 
      warningLabel.hidden = NO; 
     } 
     else { 
      [[_mapView viewForAnnotation:annotation] setHidden:NO]; 
      warningLabel.hidden = YES; 
     } 
    } 
} 

महान हालांकि पाश के विशाल आकार के कारण इस धीमी का एक बहुत नीचे का कारण बनता है जब ज़ूम इन और आउट और चारों ओर स्क्रॉल काम करता है। मैं इसे संभालने के बेहतर तरीके के बारे में सोचने के लिए प्रतीत नहीं कर सकता, क्या वर्तमान में प्रदर्शित होने वाली टिप्पणियों या लूप के आकार को कम करने के लिए उन पंक्तियों के साथ कुछ लूप करने का कोई तरीका है?

उत्तर

7

जैसा कि मैं आपका कोड समझता हूं, यदि आप नक्शा दृश्य एक निश्चित निर्दिष्ट मूल्य से अधिक ज़ूम आउट करते हैं तो आप सभी एनोटेशन के विचार छुपा रहे हैं।

मुझे ऐसा लगता है कि और अधिक निम्नलिखित की तरह कुछ बेहतर होगा:

- (void)mapView: (MKMapView*)_mapView regionDidChangeAnimated: (BOOL)animated 
{ 
    if (_mapView.region.span.latitudeDelta > .010 && self.mapViewsHidden == NO) { 
     for (MapAnnotation* annotation in _mapView.annotations) { 
      [[_mapView viewForAnnotation: annotation] setHidden: YES]; 
     } 
     [self.warningLabel setHidden: NO]; 
     [self setMapViewsHidden: YES]; 
    } 
    else if (_mapView.region.span.latitudeDelta <= .010 && self.mapViewsHidden == YES) { 
     for (MapAnnotation* annotation in _mapView.annotations) { 
      [[_mapView viewForAnnotation: annotation] setHidden: NO]; 
     } 
     [self.warningLabel setHidden: YES]; 
     [self setMapViewsHidden: NO]; 
    } 
} 
ऊपर के साथ

, ज्यादातर मामलों में केवल एक चीज के लिए इस कोड करता है इसकी जांच करता है की एक जोड़ी है।

एक और समाधान एनोटेशन को हटाना होगा जब उन्हें मानचित्र पर नहीं दिखाना चाहिए। निजी तौर पर, मुझे लगता है कि यह बेहतर होगा, इस तरह कोड को एनोटेशन के लिए विचार नहीं बनाना पड़ेगा जो अभी तक मानचित्र पर नहीं दिखाए गए हैं।

+0

यह अच्छी तरह से चीजों को बढ़ाता है :) मैं इसे कुछ डंकिम के सुझावों के साथ कार्यान्वित कर दूंगा और सब कुछ बिजली तेज होना चाहिए। – Alex

+0

हाय, मुझे setMapViewsHidden में क्या करना चाहिए? उन एनोटेशन छुपाएं? – Misha

+0

MapViewsHidden एक बूल संपत्ति है। –

6

मैं कुछ चीजों का सुझाव दूंगा। एक, annotationsInMapRect: विधि को देखें। दस्तावेज़ों के अनुसार, यह कहता है:

यह विधि मानचित्र के किसी विशेष भाग में एनोटेशन ऑब्जेक्ट्स को पुनर्प्राप्त करने का एक तेज़ तरीका प्रदान करती है। यह विधि एनोटेशन संपत्ति में वस्तुओं की रैखिक खोज करने से कहीं अधिक तेज़ है।

दो, dequeueReusableAnnotationViewWithIdentifier: पर देखें। दस्तावेज़ों के अनुसार, यह कहता है:

प्रदर्शन कारणों से, आपको आम तौर पर अपने मानचित्र दृश्यों में MKAnnotationView ऑब्जेक्ट का पुन: उपयोग करना चाहिए। चूंकि एनोटेशन विचार ऑफ़स्क्रीन ले जाते हैं, नक्शा दृश्य उन्हें आंतरिक रूप से प्रबंधित पुन: उपयोग कतार में ले जाता है। चूंकि नई टिप्पणियां ऑनस्क्रीन पर जाती हैं, और आपका कोड एक संबंधित एनोटेशन दृश्य प्रदान करने के लिए कहा जाता है, तो आपको हमेशा एक नया निर्माण करने से पहले मौजूदा दृश्य को हटाने का प्रयास करना चाहिए। स्क्रॉलिंग जैसे महत्वपूर्ण महत्वपूर्ण संचालन के दौरान डेक्यूइंग समय और स्मृति बचाता है।

अंत में, कुछ विचार। इन परिवर्तनों को करने के बजाय हर बार - (void)mapView:(MKMapView *)_mapView regionDidChangeAnimated:(BOOL)animated विधि कहा जाता है, इसे किसी अन्य नियम के अनुसार करने के बारे में कैसे करें (जैसे कि टाइमर को निकाल दिया जाता है [टाइमर को हर बार कॉल करने के लिए सुनिश्चित करें]]? विचार करने के लिए एक और बात: एनोटेशन को एक साथ समूहबद्ध करने के बारे में कैसे एक दूसरे के करीब हैं? आइए मान लें कि आप ज़ूम आउट हैं जहां रोड आइलैंड बहुत छोटा दिखता है, शायद सिर्फ एक दर्जन पिक्सेल चौड़ा है, और आपके पास रोड आइलैंड में 100 अंक हैं - आपको केवल एक पिन दिखाना चाहिए।

आशा है कि इससे मदद मिलती है!

+0

अरे डॉनकिम, मेरे पास पहले से ही डेक्यू है, उपयोग करने योग्य एनीमेशन ViewWithIdentifier: जगह पर, लेकिन मैं उन अन्य तकनीकों को देखूंगा जो आप सुझाव देते हैं और सबकुछ तेज़ी से काम करने के लिए सुझाव देते हैं। यह एक शर्म की टिप्पणियां है IMapRect केवल 4.2 में समर्थित है, ऐसा लगता है कि यह मेरी सभी परेशानियों को हल करेगा – Alex

+0

मेरे अनुभव में dequeueReusableAnnotationViewWithIdentifier कभी पुरानी एनोटेशन नहीं देता है। – malhal

+0

एनोटेशन InMapRect वास्तव में निर्देशांक की गणना करने से वास्तव में तेज़ तरीका है। – Skoua

2

मैंने OCMapView का उपयोग करके क्लस्टर में अपनी टिप्पणियां समूहित करना समाप्त कर दिया। यह मुफ्त, और मौजूदा कोड में लागू करने के लिए बहुत आसान है।

ज़ूम आउट होने पर यह स्वचालित रूप से आपकी एनोटेशन को समूहित करता है और जब आप ज़ूम इन करते हैं तो वे अव्यवस्थित दिखाई देते हैं।

मुझे पता है कि यह एक पुराना सवाल है, लेकिन यह किसी और चीज को करने की कोशिश करने का एक अच्छा विकल्प है।

+0

इस पुराने प्रश्न की समीक्षा के लिए धन्यवाद। उपयोगी पुस्तकालयों को इंगित करना हमेशा अच्छा होता है जो समस्या को हल करने में मदद करेंगे, भले ही कोई जवाब पहले ही स्वीकार कर लिया गया हो। –

संबंधित मुद्दे