17

ユーザーの位置を取得する必要があるビュー コントローラーが複数あるため、ViewController がユーザーの最新の位置を取得するために呼び出すことができる別のクラスを作成したいと考えました。

locationManager:didUpdateToLocation:fromLocation は void を返します。ユーザーの緯度と経度が計算されたらすぐに緯度と経度のデータを ViewControllers に戻すにはどうすればよいですか?

locationManaging クラスで getter と setter を書くこともできますが、そうすると、ViewController クラスから緯度の getter メソッドと経度の getter メソッドを呼び出すタイミングをどのように知ることができるでしょうか? ViewController のメイン スレッドを保持して、locationManaging クラスからの緯度と経度の値を待機させるにはどうすればよいですか?

ありがとう!

4

5 に答える 5

23

user1071136が言ったように、シングルトンロケーションマネージャーはおそらくあなたが望むものです。NSObjectのサブクラスであるクラスを作成します。プロパティは1つだけCLLocationManagerです。

LocationManagerSingleton.h:

#import <MapKit/MapKit.h>

@interface LocationManagerSingleton : NSObject <CLLocationManagerDelegate>

@property (nonatomic, strong) CLLocationManager* locationManager;

+ (LocationManagerSingleton*)sharedSingleton;

@end

LocationManagerSingleton.m:

#import "LocationManagerSingleton.h"

@implementation LocationManagerSingleton

@synthesize locationManager;

- (id)init {
    self = [super init];

    if(self) {
        self.locationManager = [CLLocationManager new];
        [self.locationManager setDelegate:self];
        [self.locationManager setDistanceFilter:kCLDistanceFilterNone];
        [self.locationManager setHeadingFilter:kCLHeadingFilterNone];
        [self.locationManager startUpdatingLocation];
        //do any more customization to your location manager
    }

    return self;
}    

+ (LocationManagerSingleton*)sharedSingleton {
    static LocationManagerSingleton* sharedSingleton;
    if(!sharedSingleton) {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            sharedSingleton = [LocationManagerSingleton new];
        }
    }

    return sharedSingleton;
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    //handle your location updates here
}

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
    //handle your heading updates here- I would suggest only handling the nth update, because they
    //come in fast and furious and it takes a lot of processing power to handle all of them
}

@end

最近受信した場所を取得するには、を使用します[LocationManagerSingleton sharedSingleton].locationManager.location。正確な位置を取得するためにGPSをウォームアップするのに数秒かかる場合があります。

于 2012-07-16T22:29:19.303 に答える
16

latitudelongitudeプロパティstartLocatingを持つシングルトン クラスを作成しますendLocating。クラスでCLLocationManagerインスタンスを作成し、そのデリゲートをシングルトンに設定します。startLocatingおよびで、インスタンスendLocatingの適切なメソッドを呼び出しCLLocationManagerます。デリゲート メソッドがlatitudeおよびlongitudeプロパティを更新するようにします。otherViewControllersでは、このシングルトンのプロパティをlatitude読み取ります。longitude

これらのプロパティを別の から読み取るタイミングを知るにはViewController、これらのプロパティにオブザーバーを設定します ( NSKeyValueObserving プロトコル リファレンスを参照してください)。

これを行う前に、インターネットで既存のコードを検索してください。

これを行った後、寛容なライセンスで GitHub にアップロードします。

于 2012-07-16T22:18:41.133 に答える
3

ロケーションマネージャーシングルトンを迅速に実装するときに行ったことは次のとおりです。これは、user1071136 の戦略と、この迅速なパターンに基づいています。

//
//  UserLocationManager.swift
//
//  Use: call SharedUserLocation.currentLocation2d from any class


import MapKit

class UserLocation: NSObject, CLLocationManagerDelegate {

    var locationManager = CLLocationManager()

    // You can access the lat and long by calling:
    // currentLocation2d.latitude, etc

    var currentLocation2d:CLLocationCoordinate2D?


    class var manager: UserLocation {
        return SharedUserLocation
    }

    init () {
        super.init()
        if self.locationManager.respondsToSelector(Selector("requestAlwaysAuthorization")) {
            self.locationManager.requestWhenInUseAuthorization()
        }
        self.locationManager.delegate = self
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
        self.locationManager.distanceFilter = 50
        self.locationManager.startUpdatingLocation()
    }

    func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
        self.currentLocation2d = manager.location.coordinate

    }
}

let SharedUserLocation = UserLocation()
于 2014-07-16T20:17:28.700 に答える