هل من الضروري إعطاء مرشح عن بعد للحصول على أفضل مكان؟

StackOverflow https://stackoverflow.com/questions/1902016

سؤال

أنا أستخدم مدير الموقع في طلبي وأنا أحصل على موقع غير دقيق "أنا أستخدم رمز أدناه للحصول على الموقع

locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;

وفي طريقة DidupDateToLocation أنا أستخدم هذا الرمز.

LatitudeData = [[NSString alloc] initWithFormat:@"%f",newLocation.coordinate.latitude];
    LongitudeData = [[NSString alloc] initWithFormat:@"%f",newLocation.coordinate.longitude];
    [UIApplication sharedApplication].networkActivityIndicatorVisible=NO;
    [self insertNewLocationInDataBase];

هل أحتاج إلى تعيين عن بعد؟ كيف يمكنني الحصول على الموقع الدقيق؟ أريد الحصول على موقع دقيق، ثم أدخل الموقع في قاعدة البيانات.

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

المحلول

الحصول على نتيجة جيدة من الموقع الأساسية في كمية معقولة من الوقت يستغرق بعض الدهود الدقيق.

المشكلة هي أنه بمجرد بدء التحديث، didUpdateToLocation سوف النار عدة مرات. في كل مرة يحررها، يجب أن يكون الموقع أكثر دقة. ومع ذلك، لا تعرف عدد المرات التي ستطلق النار فيها، ولا تعرف مدى حدوث قفل دقة الخاص بك المطلوب (إذا قام بذلك). حسب وثائق, ، يتم إنشاء أحداث إضافية إذا كانت المسافة الحد الأدنى للحتبة (كما هو محدد من قبل distanceFilter الممتلكات) تم تجاوز أو يتم تحديد قيمة موقع أكثر دقة. تغيير distanceFilter لن تعطيك موقعا أفضل (ما لم يكن، بالطبع، أنت مهتم بدقة الحركات).

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

  • اضبط الموقت بعد أن ترسل startUpdating لاستدعاء محدد (يمكن أن يكون بسيطة مثل performSelector:afterDelay:). اضبط تأخيرك بحد أقصى قدر من الوقت الذي ترغب في انتظار تقريب معقول. في طريقة تلك المحدد، أتحقق من التأكد من أن الموقع دقيق بما يكفي للتنسيب في قاعدة البيانات، وإدراجه. إذا لم يكن الأمر كذلك، فسأنبه المستخدم.
  • في didUpdateToLocation, ، تجاهل على الفور أي مواقع قديمة جدا. غالبا ما يقوم موقع المبلغ في كثير من الأحيان أولا بتراجع القيمة المخزنة مؤقتا لموقعها - وقد يكون قديما جدا.
  • في didUpdateToLocation, ، ما عليك سوى حفظ أحدث النتيجة بمتغير مثيل إذا لم يكن الدقة المرجوة.
  • في didUpdateToLocation, ، إذا كان الموقع الجديد دقيقا بما فيه الكفاية، إلغاء أداء المحدد بعد تأخير، وبدلا من ذلك يطلق عليه على الفور.

هذا مجرد رسم تقريبي، ولكنه إعداد متعدد الاستخدامات، يمكنك بسهولة أن تمتد بسهولة للحصول على الوظيفة التي تريدها.

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

- (void)viewWillAppear:(BOOL)animated {
    [self.locationManager startUpdatingLocation];
    [self performSelector:@selector(finishUpdating) withObject:nil afterDelay:10.0];
    [super viewWillAppear:animated];
}

- (void) locationManager:(CLLocationManager *)manager
     didUpdateToLocation:(CLLocation *)newLocation
            fromLocation:(CLLocation *)oldLocation {
    /* Refuse updates more than a minute old */
    if (abs([newLocation.timestamp timeIntervalSinceNow]) > 60.0) {
        return;
    }
    /* Save the new location to an instance variable */
    self.lastUpdatedLocation = newLocation;

    /* If it's accurate enough, cancel the timer */
    if (newLocation.horizontalAccuracy < 20.0) {
        [NSObject cancelPreviousPerformRequestsWithTarget:self 
                                                 selector:@selector(finishUpdating) 
                                                   object:nil]
        /* And fire it manually instead */
        [self finishUpdating];
    }
}

- (void) finishUpdating {
    /* Check the accuracy of self.lastUpdatedLocation, and either
     * save it or alert the user that it's not accurate enough */
    [self.locationManager stopUpdatingLocation];
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top