3

AppDelegateViewController을 모델 corelocation 클래스의 리스너로 설정하려면 어떻게해야합니까? 적절한 디자인 선택은 무엇입니까 ??iOS에서 CoreLocation 모델 클래스의 수신기로 ViewController 및 AppDelegate를 설정합니다.

CoreLocation 및 위치 업데이트를 구현하는 모델 클래스가있는 데 관심이 있습니다. 이 클래스는 sharedSingleton이어야합니다. 내 AppDelegateViewController 모두 액세스하려고하기 때문입니다.

viewController을 호출 할 때 CLLocationManagerstartUpdatingLocation을 사용하고 싶습니다.

앱이 백그라운드로 들어가면 startMonitoringSignificantLocationChanges를 사용하여 AppDelegate에서 위치 업데이트를 모니터링하고 싶습니다.

내 질문은 모델 유형을 설정하여 이러한 다양한 유형의 위치 업데이트를 처리하고 ViewController 또는 AppDelegate에 새 위치가 있음을 알리는 방법입니다. NSNotification을 사용 하시겠습니까? 위임은 일대일 관계이므로 작동하지 않는 것 같습니다.

디자인 방법을 이해하는 데 도움을 주셔서 감사합니다.

감사합니다.

+1

[이 게시물을보십시오] (http://stackoverflow.com/a/13896966/593709) –

+0

감사합니다! 의미가 있습니다 –

답변

9

AppDelagete에서 locationManager를 사용할 수 있습니다. 또한 앱 위임자가 모든 애플리케이션의 위치 업데이트를 처리하도록합니다.

AppDelegate.h

@interface AppDelegate : NSObject <UIApplicationDelegate,CLLocationManagerDelegate...> { 
    ... 
    CLLocationManager* locationManager; 
    CLLocationCoordinate2D myLocation; 
    ... 
} 
@property(nonatomic) CLLocationCoordinate2D myLocation; 
... 
@end 

컨트롤러에서

@implementation AppDelegate 
- (void)applicationDidFinishLaunching:(UIApplication *)application 
{ 
    locationManager = [[CLLocationManager alloc] init]; 
    locationManager.delegate = self; 
    locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move 
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; // 100 m 
    [locationManager startUpdatingLocation]; 
    ... 
} 

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
    locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move 
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; // 100 m 
    [locationManager startUpdatingLocation]; 
} 


- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    [locationManager startMonitoringSignificantLocationChanges]; 
} 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{ 
    myLocation = newLocation.coordinate; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"updateControlersThatNeedThisInfo" object:nil userInfo:nil]; 
} 

... 

AppDelegate.m :

ViewController.m

... 
- (void)viewDidAppear:(BOOL)animated 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(yourFunction) name:@"updateControlersThatNeedThisInfo" object:nil]; 
} 

-(void)yourFunction{ 
    AppDelegate *app = [[UIApplication sharedApplication] delegate]; 
    CLLocation myLocation = app.myLocation; 
    if(app.applicationState == UIApplicationStateBackground) 
      //background code 
    else 
      //foreground code 
    ... 
} 
+0

이 모든 것이 의미가 있습니다.하지만 내 앱이 백그라운드에 있고 내 앱이 포 그라운드에있을 때를 구분하는 방법은 무엇입니까? 배경에있을 때 significantLocationChange를 사용하고 내보기 컨트롤러에 알리고 싶지 않습니다. –

+0

안녕하세요, 저는 배경과 전경을 처리 할 수 ​​있도록 답변을 업데이트했습니다. 두 클래스의 업데이트를 참조하십시오. 덕분에 – Luda

+0

! 이건 정말 잘 작동 –