سؤال

لدي برنامج مع إعداد مدير الموقع مثل هذا:

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

أحتاج إلى دقة إلى ما بين عشرة أمتار، ولكنها تستغرق بعض المكالمات بطريقة مفوض DidupDateToLocation لإيجاد الموقع في هذه الدقة. كيف أذهب لتأخير نداء هذه الطريقة أو فقط الإشارة إلى متى يتم تحقيق الدقة المرغوبة من أجل المضي قدما في البرنامج.

الآن يحاول العائدات مع الموقع الأول الذي تم إرجاعه. حتى تحديث الموقع الثاني ليس دقيقا كما هو متوقع.

شكرا مقدما!

هل كانت مفيدة؟

المحلول

نظرا لأن كل مكالمة مندوب تتضمن شخصية دقة، إلا أن تعود ببساطة من الطريقة حتى يتم الوصول إلى الدقة المرغوبة (تحذير: قد لا يحدث ذلك أبدا).

لا يمكنك مجرد القفز إلى نتيجة عشرة أمتار - هناك سبب يدعى الدقة "المطلوبة" وليس الدقة الإلزامية. عليك أن تعطيها الوقت لحساب المزيد من المراكز الدقيقة.

نصائح أخرى

لقد تناولت مؤخرا هذه المشكلة واكتشفت، عن طريق قراءة الوثائق بذكاء في النهاية، يعمل Corelocation في مؤشر ترابط منفصل، حتى تتمكن من بدء تشغيله ثم استرداد الأحداث أثناء تحديثه. انها في الوثائق تحت النمط "الحصول على موقع المستخدم". وبعد حتى هنا حيث تبدأ في التحديث:

- (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];
    }
}

وبهذه الطريقة ستبقى تلقي الأحداث ثم قم بإيقاف تشغيل جهاز استقبال GPS لتوفير الطاقة. بالطبع يحتاج إلى مهلة وطريقة تخزين الموقع وقبوله بأفضل دقة أفقية إذا أخرجت أوقاتا، لكنني لم أحسب كيفية القيام بذلك حتى الآن.

تتمثل إحدى الاستراتيجية في بدء مؤقت لفترة طويلة بما يكفي للحصول على إصلاح (والتي ستكون مقبولة أيضا للمستخدم)

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

بدء تشغيل مدير الموقع في تقديم التحديثات. عندما ينتهي مؤقت الموقت (أو تحصل على دقة مقبولة) إيقاف التحديثات واستخدام هذا الموقع.

ربما يكون أفضل ما ستحصل عليه. قد ترغب في إعطاء المستخدم خيار المحاولة مرة أخرى للحصول على موقع إذا كان لا يزال غير دقيق بما فيه الكفاية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top