0

我有這個問題: 這裏是我的appDelegate文件的一部分,我創建了一個「performSelectorInBackground」方法。iPhone performSelectorInBackground

- (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中,我顯示了當前位置,但它是錯誤的。有時是正確的,但往往是錯誤的。 問題在哪裏?有沒有任何選項如何檢查後臺線程是否結束?或者其他解決方案爲我的問題(我只需要:顯示與活動指示燈和一些消息飛濺(此消息更改方法,如初始化,獲取位置等),然後我需要獲取位置,刪除飛濺和顯示firstViewController)。 ..感謝了很多

編輯:這裏是位置代碼:

- (void) getLocation 
{ 


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

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



} 
+1

你是不是出用於接收和評估的位置,但只是沒有連接到您的問題在所有的代碼。 – Till

回答

0

請記住,該位置更新運行的時間越長,越精確它得到。該地點的第一個「命中」並不總是最好的(大部分時間是錯誤的)。

也許你可以顯示你的代碼,你有CLLocationManager的事件。

另外,錯誤的位置偏離正確的位置有多少?我認爲AGPS首先通過使用附近的WiFi熱點快速檢查其位置,然後通過使用GPS芯片獲得更精確的位置。

+0

我認爲解決方案是檢查背景方法是否完成。但我不知道如何檢查它... – mysho

0

無論您在哪裏使用您獲取的位置(我無法從您發佈的代碼中看到該位置),您應該檢查您正在接收的newLocation的horizo​​ntalAccuracy屬性(並且如果高度很重要,也應該使用verticalAccuracy屬性) 。你可以這樣說:

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

但是,當我在主線程(不在後臺)執行方法嘗試這一切時,一切工作正常,好... – mysho

+0

我試試這個:[self performSelectorOnMainThread:foo withObject: foob​​ar waitUntilDone:NO];但沒有任何改變... – mysho

+0

我不是說這會解決你的問題。我只是說這是要注意的事情。您的問題*顯示*是第一對位置更新,這是您正在使用的位置更新非常不準確。通過使用我向您展示的變化(等待使用該位置的方法,直到獲得足夠的準確性,然後您將獲得所需的準確性。) –

相關問題