هل من الضروري إعطاء مرشح عن بعد للحصول على أفضل مكان؟
-
19-09-2019 - |
سؤال
أنا أستخدم مدير الموقع في طلبي وأنا أحصل على موقع غير دقيق "أنا أستخدم رمز أدناه للحصول على الموقع
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];
}