2013-05-06 54 views
0

我正在使用單例類來跟蹤用戶的位置。如果我從我正在運行的應用程序中實例化類並開始跟蹤一切都很好。但是,如果應用程序已關閉(在應用程序切換器中,所以它不再有後臺),並重新啓動,我檢查是否存在活動事件。在這種情況下,我實例化類並開始位置跟蹤。在locationManager被實例化和位置箭頭出現在狀態,但在AppDelegate中使用CLLocationManager實例化Singleton類didFinishLaunchingWithOptions

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
or 
    -(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error 
never get called 

什麼想法?

代碼singelton類:從AppDelegate中

@interface AlarmMeTrackUserLocation() <CLLocationManagerDelegate> 
@property (strong, nonatomic) CLLocationManager *locationManager; 
@end 

@implementation AlarmMeTrackUserLocation  
-(void)toggleLocationUpdates:(bool)toggle { 

    if (!toggle) { 
     [self.locationManager stopUpdatingLocation]; 
     self.locationManager = nil; 
     sharedInstance = nil; 
     NSLog(@"--- UserTrack Stopped ---"); 
     return; 
    } 


    if (!self.locationManager && toggle) { 
     self.locationManager = [[CLLocationManager alloc] init]; 
     self.locationManager.delegate = self; 
     self.locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; 
     self.locationManager.pausesLocationUpdatesAutomatically = YES; 
     self.locationManager.distanceFilter = 200; 
    } 

    NSLog(@"--- UserTrack Started"); 
    [self.locationManager startUpdatingLocation]; 

} 

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { 
    ... 
} 

- (void)locationManager:(CLLocationManager *)manager 
    didFailWithError:(NSError *)error { 
    ... 
} 

+ (AlarmMeTrackUserLocation *)sharedTrackUserLocation { 

    if (sharedInstance == nil) { 
     sharedInstance = [[super allocWithZone:NULL] init]; 

     //NSLog(@"--- New Instance created ---"); 

     return sharedInstance; 
    } 

    NSLog(@"--- Existing Instance Used ---"); 

    return sharedInstance; 
} 

代碼:

@property (strong, nonatomic) AlarmMeTrackUserLocation *userTrack; 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    ... 
    self.userTrack = [AlarmMeTrackUserLocation sharedTrackUserLocation]; 
    self.userTrack.event = currentEvent; 
    [self.userTrack toggleLocationUpdates:YES]; 

} 
+0

應該沒有必要這樣做。如果位置管理器在我們進入後臺時進行跟蹤,那麼當我們回到前臺時它會自動恢復。 – matt 2013-05-06 17:49:10

+0

感謝您的提示。我的意思是當應用程序在應用程序切換器中關閉時,所以它不再是後臺 - 在問題中澄清了這一點。 – kosekmi 2013-05-06 19:50:48

+1

如果應用程序在應用程序切換器中被*殺死*,它已經死亡。在這種情況下,它從冷啓動啓動。所以你現在應該「從運行的應用程序中實例化類,並開始跟蹤一切都很好」 - 換句話說,兩種情況下的條件完全相同。因此,您需要考慮(並顯示)啓動時開始跟蹤的代碼以及開始跟蹤的代碼「在我的正在運行的應用程序中」。不管有什麼不同,這都是麻煩的原因。 – matt 2013-05-06 20:48:27

回答

0

在仔細閱讀我的代碼,我只能看到一個區別:在應用程序委託我開始backgrounding線程來獲取數據從網絡服務器。如果請求完成,單例類將被實例化並且locationManager被設置(仍然在後臺線程中)。

切換回主線程並實例化其最後的工作!

如此看來,你不能從一個backgrounding線程「但是如果應用程序被關閉並重新啓動我檢查是否有一個活動事件」委派CLLocationManager

+1

您可以添加一些示例代碼,瞭解如何在主線程上獲得代碼塊?您是否在Web服務響應中使用dispatch_async? – 2015-03-09 09:06:27

+0

我剛剛看到您的評論,對於遲到的回覆感到抱歉。這個線程是從'13,不幸的是我沒有代碼了 – kosekmi 2015-03-26 16:39:21

相關問題