2014-05-06 11 views
11

मैं एक ऐप में स्वत: पूर्ण (एक नया चरित्र जोड़ा गया एक खोज) लागू कर रहा हूं जो पते की खोज करता है, और मुझे MKErrorDomain error 3 मिल रहा है, जो MKErrorLoadingThrottled है। Apple dev के अनुसार यह त्रुटि तब होती है जबआईओएस ऐप स्थानीय खोजों से थ्रॉटल हो रहा है

डेटा लोड नहीं किया गया था क्योंकि डेटा थ्रॉटलिंग प्रभावी है। यह त्रुटि तब हो सकती है जब कोई ऐप समय पर डेटा के लिए लगातार अनुरोध करता है।

मुझे पता है कि कितने अनुरोध किए जा रहे हैं, एक खोज क्वेरी में प्रत्येक नए charachter के लिए एक (जैसा कि आप काम करने के लिए स्वत: पूर्ण उम्मीद करेंगे)। निश्चित रूप से, मैं एक तेज टाइपर हूं, लेकिन केवल 10 या 15 अनुरोधों के बाद सीमा को मारने में सक्षम होना बेतुका लगता है। निम्नलिखित दो स्रोत संदर्भों को देखते हुए, मुझे समझ में नहीं आता कि मैं थ्रॉटल क्यों हो रहा हूं।

Apple dev के अनुसार:

एप्लिकेशन या डेवलपर आईडी प्रति कोई अनुरोध सीमा है, तो अच्छी तरह से लिखा है कि सही ढंग से काम कोई समस्या नहीं अनुभव करना चाहिए क्षुधा हैं। हालांकि, थ्रॉटलिंग खराब लिखित ऐप में हो सकती है जो अत्यधिक बड़ी संख्या में अनुरोध बनाता है।

और जेम्स हावर्ड said at a WWDC:

और दूसरी बात मैं के बारे में बात करना चाहता हूँ के रूप में इस एपीआई पर उपयोग की सीमा है। तो, मुझे यह घोषणा करने में प्रसन्नता हो रही है कि कोई एप्लिकेशन या डेवलपर पहचानकर्ता व्यापक उपयोग सीमा नहीं है। तो, यदि आपके पास ऐसा ऐप है जिसमें बहुत से उपयोगकर्ता हैं और आप अनुरोधों के बहुत सारे करना चाहते हैं, तो यह ठीक है।

यह काम करेगा।

और हमारे पास जो थ्रॉटलिंग है, वह वास्तव में बग्गी ऐप्स के विरुद्ध रक्षा की पहली पंक्ति है। इसलिए, यदि आप अनंत लूप में दिशानिर्देश अनुरोध या स्थानीय खोज अनुरोध डालते हैं, तो आपको एक बग मिल गई है, अंत में आपको थ्रॉटल हो जाएगा।

लेकिन अगर आप कुछ उचित करते हैं, आप कहते हैं कि ओह, मैं सिर्फ उपयोगकर्ता इनपुट के जवाब में दिशाओं करने जा रहा हूं और आप जानते हैं, क्योंकि हम उन्हें उस उदाहरण से पता चला है कि आप उन लोगों में से कुछ कर सकते हैं।

जैसा कि हमने एक उपयोगकर्ता इनपुट, के जवाब में दो दिशा-निर्देश अनुरोध किए हैं, ठीक है। लेकिन, आप जानते हैं कि जब भी उपयोगकर्ता स्क्रीन पर टैप करता है तो 10,000 आप कर रहे हैं, तो आप थ्रॉटल हो जाएंगे। लेकिन, बस इसे उचित रखें और आप ठीक होंगे।

यह क्यों हो रहा है यह कोई विचार है ??

+3

मैं उस तरह काम करने के लिए स्वत: पूर्ण उम्मीद नहीं होता। मैं एक प्रारंभिक अनुरोध की अपेक्षा करता हूं और फिर आगे के इनपुट के आधार पर इन परिणामों को स्मृति में फ़िल्टर करने की अपेक्षा करता हूं। – jrturton

+0

यह आपके प्रश्न से स्पष्ट नहीं है कि आप क्या कर रहे हैं। क्या आप खोज रहे हैं, या आप geocoding (यानी एक पते में एक स्थान बदलना, या पते के आधार पर एक स्थान ढूँढना) हैं। – quellish

+0

@quellish पहली बात यह है कि मैं उल्लेख करता हूं कि यह पते की खोज करता है। इसके अलावा, प्रश्न का शीर्षक देखें। –

उत्तर

10

स्वत: पूर्ण करने के लिए एक विशेष एपीआई की आवश्यकता होती है।MapKit ऐसा इंटरफ़ेस प्रदान नहीं करता है। सामान्य खोज एपीआई के दर्जनों अनुरोधों को फायर करने से जबरदस्त भार होता है।

  1. Google स्थल के साथ जाएँ:

    आप मूल रूप से दो विकल्प हैं। उनके पास एक समर्पित Places Autocompletion API है। GitHub पर आईओएस के लिए भी एक पूर्ण पुस्तकालय है।

  2. अनुरोधों की संख्या कम करें, उदा। यदि उपयोगकर्ता ने 300ms के लिए टाइपिंग रोक दी है और केवल तभी अनुरोध किया जा सकता है जब कोई पूर्व अनुरोध बकाया नहीं है। लेकिन यह अभी भी कोई गारंटी नहीं है कि ऐप्पल आपके अनुरोधों को थ्रॉटल नहीं करेगा।

+3

विकल्प 2 मुझे तर्क लगता है और किसी भी मामले में जरूरी है। – Rivera

+0

SPGooglePlacesAutocomplete नामक Google स्थल पर ऑब्जेक्टिव-सी रैपर का उपयोग करके समाप्त हुआ। बहुत अच्छा काम करता है! –

1

टाइम प्रोफाइलर इंस्ट्रूमेंट में अपना ऐप चलाएं, देखें कि जब आप टाइप करते हैं तो उस विधि को कितने कॉल किए जा रहे हैं।

4

MKLocalSearch मुख्य रूप से ब्याज (व्यवसायों, आदि) एक नक्शे के सीमा के भीतर के बिंदु को खोजने के लिए करना है। CLGeocoder संरचित पता और स्थान लुकअप के लिए है।

CLGeocoder documentation निर्दिष्ट करता है कि CLGeocoder अनुरोध दर सीमित है, और दस्तावेज़ीकरण एक अच्छा नागरिक बनने के तरीके पर मार्गदर्शन प्रदान करता है।

विशेष नोट्स दिशानिर्देशों में पहला आइटम है: "किसी भी उपयोगकर्ता कार्रवाई के लिए सबसे अधिक अनुरोध भेजें"। इसे MKLocalSearch पर भी लागू किया जाना चाहिए - यदि आपके पास एक ही समय में उड़ान में एकाधिक अनुरोध हैं, तो आपको बहुत परेशान होने की संभावना है।

यह वास्तव में कार्यान्वित करने में बहुत आसान है: एक नया MKLocalSearchRequest भेजा गया है, किसी भी लंबित अनुरोध को रद्द करें। यह आपके द्वारा वर्णित स्वत: पूर्ण करने के लिए बहुत अधिक समझ में आता है: यदि उपयोगकर्ता चौथे चरित्र में प्रवेश कर रहा है, तो आपको शायद तीसरे चरित्र के लिए अनुरोध या प्रतिक्रिया की आवश्यकता नहीं है।

+0

एमकेएलोकलशर्च की तुलना में सीएलजीकोडर के अलग-अलग परिणाम हैं – HotJard

1

मुझे एप्पल मैपकिट एपीआई के साथ सुझाव देने में मदद के लिए स्विफ्ट पर हेल्पर लिखा है। जब उपयोगकर्ता टाइपिंग अनुरोध बंद कर देता है तो यह कॉल खोज अनुरोध है। https://github.com/ArniDexian/GeocodeHelper

उपयोग सुंदर बस है:

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) { 
    GeocodeHelper.shared.decode(searchText.trimmed(), completion: { [weak self](places) ->() in 
     self?.dataSource.locations = places 
     self?.tableView.reloadData() 
     return 
     }) 
} 
संबंधित मुद्दे