从 iOS 应用程序中的多个视图重复调用地理位置单例类

Posted

技术标签:

【中文标题】从 iOS 应用程序中的多个视图重复调用地理位置单例类【英文标题】:Repeat Calls to geolocation Singleton class from multiple views in iOS app 【发布时间】:2014-07-30 07:18:03 【问题描述】:

在阅读了一些关于堆栈溢出的建议和其他一些文章后,我实现了一个单例类,它允许我调用一个方法来更新用户的当前位置。为了避免不断更新位置信息,我添加了一个 StopUpdatingPosition 调用。这第一次可以正常工作,但是后续调用失败。

我相信这是因为在提供的示例中启动地理定位的方式,它检查单例是否已经到位(?)

如果一个单例被初始化,它会保留在内存中吗?在随后的通话中,我是否可以检查是否是这种情况并请求它开始更新位置?

这是我迄今为止尝试过的。

- (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];
        geocoder = [[CLGeocoder alloc] init];
    

    return self;


+ (LocationFunction*)sharedSingleton 
    static LocationFunction* sharedSingleton;
    if(!sharedSingleton) 
        @synchronized(sharedSingleton) 
            sharedSingleton = [LocationFunction new];
        
    

    return sharedSingleton;


- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

    NSLog(@"didUpdateToLocation: %@", newLocation);
    CLLocation *currentLocation = newLocation;

    if (currentLocation != nil) 
        myLat = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude];
        myLong = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude];
    

    // Store the Long & Lat to global variables here
    NSLog(@"Resolving the Address");


         else 
    // Handle location lookup fail here
        
     ];
    [manager stopUpdatingLocation];
    

我正在寻找一种从不同视图控制器调用外部类中的方法的方法。此方法获取用户的当前位置(经纬度),将信息记录在全局变量中,停止任何更新位置方法的请求,并在完成时通知视图控制器。

感谢指点。

【问题讨论】:

你在帖子的不同地方谈论了什么例子。愿意提供链接吗? 您正在使用的委托方法已弃用 - 请参阅 CLLocationManagerDelegate 参考。我将删除对开始/停止更新位置的调用,并在您的单例类上提供执行此操作的实例方法。然后,您可以根据需要调用它们。单例将保留在内存中,因为它持有对自身的引用。 @Paulw11 谢谢。我会看看你的建议。 @Andy897 恐怕我手头没有。 【参考方案1】:

另一个*** question 有一个提供解决方案的答案。但是请注意,调用不正确(我无法对答案发表评论 - 对于***来说太新了!)。它应该引用“sharedManager”:

- (void)viewDidLoad

    [super viewDidLoad];
    [[MyClass sharedManager] startCapture];

希望这对搜索的人有所帮助。

【讨论】:

以上是关于从 iOS 应用程序中的多个视图重复调用地理位置单例类的主要内容,如果未能解决你的问题,请参考以下文章

iOS:动画子视图而不调用 layoutSubviews

单视图 iOS 上的多个投影

在多个视图控制器之间传递数据[重复]

如何从调用方法didSelectRowAtIndexPath将数据传递给ios应用程序中的子视图控制器

如何从单视图应用程序启动 cocos2D 游戏

在 iOS 中等待多个网络异步调用