0

locationManagerが更新を受信し、CoreDataを使用して保存するバックグラウンドタスクが存在するようにアプリを設定しようとしています。locationManagerをバックグラウンドタスクとして実行するために使用しているコードは次のとおりです。

(void)viewDidLoad
{
    [super viewDidLoad];

timerAndMap = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
            [self endDate];
     }];

        if(nil == locationManager) {
        locationManager = [[CLLocationManager alloc] init];
        }

    locationManager.delegate = self;
    locationManager.distanceFilter = 500;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [locationManager startUpdatingLocation];

  [[UIApplication sharedApplication] endBackgroundTask:timerAndMap];

}

ただし、私が抱えている問題は、デリゲートメソッドをバックグラウンドスレッドの一部にする方法を理解することです。locationManagerがdidUpdateToLocationを呼び出すとき、新しい場所の経度、緯度、および日付をエンティティの属性として一時的なmanagedObjectContextに保存し、メインスレッドで確立されたManagedObjectContextとマージします(アプリがバックグラウンドで実行されている新しいコアデータエンティティは、メインスレッドのManagedObjectContextに保存できません)。

4

1 に答える 1

0

場所は1秒ごとに更新され、座標を使用してNSMutableArrayを作成し、座標のリストを保持します。ポイントに到達したら、可変配列の座標を使用してNSArrayを作成し、NSMutableArrayをクリアして、NSArrayインスタンスをに渡します。バックグラウンドスレッド、および保存を実行します。

編集:新しい情報に基づく:CLLocationManagerのメソッドは非同期です。これが達成しようとしている場合、あなたができることは、バックグラウンドブロックをディスパッチし、デリゲートコールバックのブロック内にエンティティを作成することです。これを行うために、独自のシリアルdispatch_queueを管理することもできます。

あなたが何かをしているからといって、それが効率的にならない背景であることを考慮に入れてください。新しい場所を取得するたびに(1〜2秒ごとになる可能性があります)、引き続きsaveを呼び出します。永続ストアへの書き込みにはコストがかかります。

于 2012-08-18T00:19:55.783 に答える