iPhone executeSelectorInBackground - PullRequest
       4

iPhone executeSelectorInBackground

0 голосов
/ 21 ноября 2011

У меня есть эта проблема: Вот часть моего файла appDelegate, где я создаю метод "executeSelectorInBackground".

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

[self addSplash];

[self getLocation];

[self performSelectorInBackground:@selector(backgroundOp) withObject:nil];

return YES;

}

Сначала я добавляю заставку, я получаю местоположение и фон вызоваметод.Это содержание фонового метода:

- (void) backgroundOp
{

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    [self createEditableCopyOfDatabaseIfNeeded];

    [self initTempData];

    [self initApp];

    [self checkDataVersion];

    } 

    [self setAppStrings];

    [self performSelectorOnMainThread:@selector(resultOp) withObject:nil waitUntilDone:YES];

    [pool release];


}

Я загружаю некоторые данные, проверяю версию данных, устанавливаю строки для приложения и вызываю метод основного потока для создания кода контроллера панели вкладок здесь:

- (void) resultOp
{

    tabBarController.delegate = self;


    [self.window addSubview:tabBarController.view];
    [self addTabBarArrow];
    [self.window makeKeyAndVisible];

    [self removeSplash];

}

Здесь я создаю контроллер панели вкладок и удаляю заставку.Затем запустите мой firstViewController.

Проблема в том, что в моем firstViewController я показываю текущее местоположение, но это неверно.Иногда это правильно, но очень часто неправильно.Где проблема?Есть ли вариант, как проверить, заканчивается ли фоновый поток?Или другое решение для моей проблемы (мне нужно только: показать всплеск с индикатором активности и некоторыми сообщениями (эти сообщения изменяются в методе, например, init, get location и т. Д.), Затем мне нужно получить местоположение, удалить всплеск и показать firstViewController).. большое спасибо

Редактировать: Вот код для местоположения:

- (void) getLocation 
{


    splashScreenController.splashLabel.text = @"Localization ...";

    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.distanceFilter = kDistanceFilter;
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
    [locationManager startUpdatingLocation];



}

Ответы [ 2 ]

0 голосов
/ 21 ноября 2011

Везде, где вы используете местоположение, которое вы приобретаете (что я не могу видеть из кода, который вы разместили), вы должны проверять свойство horizontalAccuracy получаемого вами нового местоположения (и также вертикаль Accuracy, если высота имеет значение).Вы можете сказать что-то вроде

if(newLocation.horizontalAccuracy < 100) {
    //do something with newLocation
    //because it is accurate to 100 meters
}

Если вы не выполните эти типы проверок, вы можете получить действительно неточных мест, сначала на расстоянии до трех или четырех километров от вашего реального местоположения.,

Кроме того, при использовании нескольких потоков целостность данных иногда может стать проблемой.Вы должны убедиться, что переменные не доступны и не изменены одновременно в нескольких методах, или кто знает, получите ли вы правильный вывод.

Также важно отметить, что все методыВызванный в backgroundOp также будет задан в фоновом режиме, даже без явного вызова их таким образом.Используйте

[self performSelectorOnMainThread:foo withObject:foobar waitUntilDone:NO];

для возврата к основному потоку.

Редактировать:

viewDidLoad {
    [super viewDidLoad];
    iterations = -5;
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation 
    *)newLocation fromLocation:(CLLocation *)oldLocation {
    iterations++;
    if(iterations > 0) {
        if(newLocation.horizontalAccuracy < 50) {
            //do something with location with radius of uncertainty
            //of less than 50
        }
    }
0 голосов
/ 21 ноября 2011

Имейте в виду, что чем дольше выполняется обновление местоположения, тем более точным оно становится. Первый «удар» по локации не всегда лучший (в большинстве случаев это не тот случай).

Может быть, вы могли бы показать свой код, где у вас есть события CLLocationManager.

Кроме того, насколько неправильная позиция от правильной позиции? Я думаю, что устройство AGPS сначала быстро проверяет свое местоположение с помощью ближайших точек доступа WiFi, а после этого становится более точным с помощью чипа GPS.

...