2010-12-27 11 views
9

मुझे अपने ऐप में कोई समस्या है। मैं अपने ज़िप कोड को निर्धारित करने के लिए उपयोगकर्ता की स्थिति को सर्वोत्तम सटीकता के लिए ढूंढने की कोशिश कर रहा हूं। वर्तमान में मेरे पास एक बटन है, जब दबाया जाता है, locateMe नामक एक विधि शुरू करता है।स्थान पूरी तरह से मिलने तक प्रतीक्षा कैसे करें? (कोर स्थान)

-(IBAction)locateMe; { 
self.locationManager = [[CLLocationManager alloc] init]; 
locationManager.delegate = self; 
locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
[locationManager startUpdatingLocation]; 

तब मैं didUpdateToLocation:

-(void)locationManager:(CLLocationManager *)manager 
     didUpdateToLocation:(CLLocation *)newLocation 
     fromLocation:(CLLocation *)oldLocation; { 

     NSLog(@"Found location! %f,%f",newLocation.coordinate.latitude,newLocation.coordinate.longitude); 
} 

मैं पहले didUpdateToLocation में और अधिक जटिल सामान किया था क्रियान्वित किया है लेकिन जैसा कि मैंने कुछ बातें परीक्षण किया मुझे एहसास हुआ कि पहले स्थान यह पाया कम से कम में सटीक नहीं था । तो, मैं वहाँ में NSLog कॉल रख दिया और यह मुझे एक निर्गम नीचे के समान ...

Found location! 39.594093,-98.614834 
Found location! 39.601372,-98.592171 
Found location! 39.601372,-98.592171 
Found location! 39.611444,-98.538196 
Found location! 39.611444,-98.538196 

आप देख सकते हैं, यह पहली मुझे जो भीतर समस्याओं के कारण किया गया था एक मूल्य है, जो सही नहीं है देता है दे दी है मेरी ऐप क्योंकि यह सही स्थान नहीं दे रहा था।

तो, मेरा प्रश्न यहां है। क्या कोई तरीका है कि मैं स्थान प्रबंधक के लिए सबसे सटीक स्थान खोजने के लिए इंतजार कर सकता हूं?

अग्रिम धन्यवाद!

संपादित करें: मैं कुछ इस तरह चाहने हूँ:

if (newLocation.horizontalAccuracy <= locationManager.desiredAccuracy) { 
} 

लेकिन यह कभी नहीं कहा जाता हो जाता है!

उत्तर

5

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

यदि आप भू-निर्देशांक के साथ टिप्पणियां या फोटो सबमिट कर रहे हैं - जब उपयोगकर्ता ने टिप्पणी स्क्रीन लिखने के लिए प्रवेश किया था तो भू समन्वय प्राप्त करना प्रारंभ करें। जबकि वह एक संदेश टाइप करेगा - पता लगाया गया स्थान बहुत सटीक हो गया है।

+0

अब जब आप इसका जिक्र करते हैं, तो मुझे लगता है कि जैसे ही सेटिंग दृश्य खुलता है, मुझे बस स्थान प्राप्त करना शुरू करना चाहिए (यही वह जगह है जहां मैं अपना स्थान पकड़ रहा हूं)। –

+0

सहमत हुए। यदि आप बहुत जल्दी स्थान का पता लगाना शुरू कर देंगे - यह डिवाइस बैटरी को हटा देगा। इसलिए मैं केवल स्थान की पहचान करने की सलाह देता हूं जब यह वास्तव में आवश्यक हो। –

+0

आपकी मदद के लिए धन्यवाद। मैं जो पहला स्थान देता हूं उसे कैसे छोड़ सकता हूं? क्या मैं काउंटर का उपयोग करूंगा? –

2

तो आप वास्तव में देख सकते हैं कि क्या हो रहा है, अपनी नई लोकेशन ऑब्जेक्ट की क्षैतिज सटीक संपत्ति NSLoging को आजमाएं। आप देखेंगे कि यह प्रत्येक हिट के साथ स्थान पर संकुचित है।

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

+0

आह, समझ में आता है। उस संपत्ति के बारे में कभी नहीं पता था। :) –

1

एनएसएलओजी() पुरानी लोकेशन संपत्ति, मुझे लगता है कि इसे शून्य (या नहीं होना चाहिए) होना चाहिए। और आप अगर कुछ विफल रहा है userLocation छिपा सकते हैं:

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { 
    mapView.showsUserLocation = NO; 
} 

// संपादित करें: desiredAccuracy का कहना है अगर आपको लगता है कि अब तक पुरानी स्थिति से दूर ले जाने didUpdateToLocation केवल बुलाया जाता है। यदि आप वांछित सटीकता को 100 मीटर पर सेट करते हैं तो यह केवल तभी कॉल किया जाएगा जब उपयोगकर्ता अपनी पुरानी स्थिति से 100 मीटर दूर चला जाता है।

+0

जब यह पहली बार शुरू हुआ, तो 'पुराना स्थान' शून्य है। एक स्तर नीचे (सटीकता में) के बाद, यह गैर-शून्य हो जाता है। –

+0

हां यही मेरा मतलब है। आप जांच सकते हैं कि यह शून्य है और सामान्य रूप से आपके द्वारा किए जाने वाले कोड को निष्पादित न करें। –

+0

लेकिन जब भी यह शून्य नहीं है तब भी यह सटीकता का स्तर नहीं है जिसकी मुझे आवश्यकता है। –

1

अपने आवेदन के लॉन्च (या जाग) समय को बचाएं, और उस स्थान प्रबंधक से किसी भी परिणाम को छोड़ दें जो आपके ऐप को लॉन्च होने के समय से पुराना है। सीएलएलोकेशन पर एक तिथि टिकट है।

+0

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

+0

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

+0

यदि वे ऐप शुरू करते हैं तो यह थोड़ा मुश्किल हो सकता है और फिर इसे बाहर निकल सकता है (यानी, यह पृष्ठभूमि में प्रवेश करता है)। कम से कम यह मेरा उपयोग केस मैप्स एप्लिकेशन (प्रारंभ, रोकें, खुला, रोकें) के साथ है। यह ध्यान में रखते हुए कि मैं अपनी कार में हूं, परिणामस्वरूप स्थान काफी दूर हो सकता है। लेकिन एक और तरह के असफल समाधान के रूप में, यह एक बुरा नहीं है। – pschang

9

मुझे नहीं लगता कि आप इसे कैसे काम करने की उम्मीद करते हैं। इस बात की कोई गारंटी नहीं है कि आप कभी भी विशिष्ट स्तर की सटीकता के साथ एक स्थान प्राप्त करेंगे।आप मानते हैं कि आपको अंततः एक स्थान प्राप्त होगा जिसमें आपकी इच्छित सटीकता की सटीकता होगी और यह आवश्यक नहीं होगा। स्थान प्रबंधक आपको स्थान अपडेट का अनुक्रम भेज देगा जो आमतौर पर, लेकिन निश्चित रूप से हमेशा नहीं, तेजी से सटीक नहीं होगा। दुर्भाग्य से आप यह मांग नहीं कर सकते कि डिवाइस को मनमाने ढंग से सटीकता की स्थिति देने के लिए पर्याप्त सिग्नल प्राप्त हो और डिवाइस भविष्य में भविष्यवाणी करने का कोई तरीका नहीं है कि "यह सबसे सटीक स्थिति है जिसे मैं प्राप्त करने जा रहा हूं" ।

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

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

+0

+1 मुझे लगता है कि यह सबसे अच्छा जवाब है। जब स्थान सबसे सटीक स्थान प्राप्त होता है तो स्थान प्रबंधक संभवतः नहीं जान सकता है। –

+1

यह उत्तर सही है, लेकिन pedantic। बेशक यह पता लगाना असंभव है कि जब कोई स्थान उतना अच्छा होता है जितना वह प्राप्त करने जा रहा है (देखें: समस्या को रोकना)। फिर भी लोग समय के लिए एक व्यापार के साथ अच्छा डेटा प्राप्त करना चाहते हैं, और सर्वोत्तम प्रथाओं चाहते हैं। ओपी क्या चाहता था काफी स्पष्ट था - और यह एक व्याख्यान नहीं था। Evgen का उत्तर, ऊपर, सबसे अधिक उत्पादक है। – tooluser

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