0

私はこの問題を抱えています:これは、「performSelectorInBackground」メソッドを作成する appDelegate ファイルの一部です。

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



}
4

2 に答える 2

0

位置情報の更新が長く実行されるほど、より正確になることに注意してください。その場所の最初の「ヒット」が常に最良であるとは限りません(ほとんどの場合、それは間違ったものです)。

CLLocationManagerのイベントがある場所にコードを表示できるかもしれません。

また、正しい位置から間違った位置はどれくらい離れていますか?AGPSは、最初に近くのWiFiホットスポットを使用してその位置をすばやく確認し、その後、GPSチップを使用することでより正確になると思います。

于 2011-11-21T12:21:43.690 に答える
0

取得した場所を使用している場合(投稿したコードからは実際にはわかりません)、受信しているnewLocationのhorizo​​ntalAccuracyプロパティ(および高度が重要な場合はverticalAccuracyも)を確認する必要があります。あなたは次のようなことを言うことができます

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

これらのタイプのチェックを行わないと、最初は実際の場所から最大3〜4 km離れた、非常に不正確な場所を取得する可能性があります

また、複数のスレッドを使用する場合、データの整合性が問題になることがあります。変数が複数のメソッドで同時にアクセスおよび変更されていないこと、または正しい出力が得られるかどうかを誰が知っているかを確認する必要があります。

また、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
        }
    }
于 2011-11-21T12:28:35.280 に答える