2009-07-20 20 views
6

मैं एक स्थान प्रबंधक इस तरह की स्थापना के साथ एक कार्यक्रम है:CoreLocation शुद्धता संकट

self.locationManager = [[CLLocationManager alloc] init]; 
[locationManager startUpdatingLocation]; 
locationManager.delegate = self; 
locationManager.distanceFilter = kCLDistanceFilterNone; 
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters; 

मैं दस मीटर के दायरे में, तथापि, यह didUpdateToLocation प्रतिनिधि विधि के कुछ ही कॉल लेता है सटीकता की आवश्यकता को खोजने के लिए उस सटीकता पर स्थान। मैं इस विधि के कॉल में देरी के बारे में कैसे जाउंगा या प्रोग्राम के साथ आगे बढ़ने के लिए वांछित सटीकता प्राप्त करने के लिए इंगित करूंगा।

अभी यह लौटाए गए पहले स्थान के साथ आय की कोशिश करता है। यहां तक ​​कि दूसरा स्थान अपडेट अपेक्षित के रूप में सटीक नहीं है।

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

उत्तर

7

चूंकि प्रत्येक प्रतिनिधि कॉल में सटीकता आंकड़ा शामिल होता है, इसलिए जब तक आपकी वांछित सटीकता तक पहुंच नहीं जाती है तब तक विधि से वापस लौटें (चेतावनी: ऐसा कभी नहीं हो सकता है)।

आप बस दस मीटर के परिणाम तक नहीं जा सकते - इसका एक कारण है कि इसे "वांछित" सटीकता कहा जाता है और अनिवार्य सटीकता नहीं है। आपको इसे अधिक सटीक स्थितियों की गणना करने के लिए समय देना होगा।

+0

किसी कारण से, जब मैं इस संपत्ति की जांच करता हूं ([नया स्थान क्षैतिज अकसरता]), स्थान प्रबंधक केवल दो बार अपडेट होता है और नया स्थान दोनों बार समान होता है। क्या आप इसके लिए किसी भी कारण से जानते हैं? –

+0

यह तब सबसे अच्छा परिणाम है जो इसे मिल सकता है। आप हमेशा दस मीटर के भीतर परिणाम नहीं प्राप्त करेंगे - यहां तक ​​कि जब आपके पास आईफोन में एक जीपीएस है, तब भी कभी-कभी इसे सेल टॉवर त्रिकोण का सहारा लेना पड़ता है। –

2

एक रणनीति काफी देर तक एक फ़िक्स (जो भी उपयोगकर्ता को स्वीकार्य होगा)

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats 

अपडेट पहुंचाने स्थान प्रबंधक शुरू पाने के लिए अवधि के लिए एक टाइमर शुरू करने के लिए है। जब टाइमर समाप्त हो जाता है (या आपको स्वीकार्य सटीकता मिलती है) अपडेट को रोकें और उस स्थान का उपयोग करें।

शायद यह सबसे अच्छा है जिसे आप प्राप्त करने जा रहे हैं। यदि आप अभी भी पर्याप्त सटीक नहीं हैं, तो आप उपयोगकर्ता को किसी स्थान के लिए फिर से प्रयास करने का विकल्प दे सकते हैं।

4
चतुराई पर लंबी पिछले प्रलेखन पढ़ना, कि CoreLocation ताकि आप इसे शुरू कर सकते हैं और उसके बाद की घटनाओं को पुनः प्राप्त करने के रूप में यह अद्यतन करता है, एक अलग थ्रेड में चलाता द्वारा

मैं हाल ही में इस समस्या को घेरने की कोशिश की और पता चला है, । यह रूब्रिक "Getting the User's Location" के तहत प्रलेखन में है। तो यहाँ है आप कहां से शुरू अद्यतन करने:

- (void)startStandardUpdates 
{ 
    if (nil == locationManager) 
     locationManager = [[CLLocationManager alloc] init]; 
    locationManager.delegate = self; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    locationManager.distanceFilter = none; 
    [locationManager startUpdatingLocation]; 
} 

आप करते हैं तो प्रतिनिधि "स्व", यह एक ही कक्षा जहां शुरू विधि परिभाषित किया गया है करने के लिए घटनाओं भेज देंगे, तो फिर तुम सिर्फ पुनः प्राप्त करने के लिए निम्न जोड़ने के लिए घटनाक्रम:

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
    fromLocation:(CLLocation *)oldLocation 
{ 
    if (newLocation.horizontalAccuracy < 30.0) 
    { 
     NSLog(@"latitude %+.6f, longitude %+.6f\n", 
       newLocation.coordinate.latitude, 
       newLocation.coordinate.longitude); 
     [manager stopUpdatingLocation]; 
    } 
} 

इस तरह यह घटनाएं प्राप्त करेगा और फिर ऊर्जा बचाने के लिए जीपीएस रिसीवर बंद कर देगा। बेशक इसे समय-समय पर और कुछ क्षैतिज सटीकता के साथ स्थान को स्टोर करने और स्वीकार करने के लिए कुछ तरीके की आवश्यकता होती है, लेकिन मुझे पता नहीं चला कि अभी तक ऐसा कैसे किया जाए।