【问题标题】:Send Coordinate info to ViewController from a location class从位置类向 ViewController 发送坐标信息
【发布时间】:2016-06-24 03:44:29
【问题描述】:

我正在尝试编写一个可以更新设备位置的应用程序。

我设置了一个 GPS_Obtainer 类,它将获取设备的位置。 GPS_Obtainer 类会将位置信息转发给视图控制器。

我尝试使用协议,但失败了。

最好的方法是什么?如何?

【问题讨论】:

  • 通知,或者,观察者是最好的方法。
  • 协议呢?我在想的是,GPS_Obtainer 将获得最终准确的位置信息,并将信息发送给 VC。基本上,GPS_obtainer 会做最辛苦的工作,而 VC 只是收到最终的位置
  • 是的,协议也可以,其他最好的方法是将GPS_Obtainer转换为单例类,有一个属性作为委托,并在将接收它的 ViewController 中将委托设置为 self,并且不要忘记在 ViewController 释放时将其设置为 nil。
  • 是的,这就是我的想法。干杯队友,我是初学者。还有一个问题,我知道如何在 VC 之间传输数据,但是如何将数据从 GPS_Obtainer 类发送到 VC 类?谢谢老哥
  • 我已经添加了一个答案检查,它可能会对你有所帮助。

标签: ios objective-c location


【解决方案1】:

您可以选择使用NotificationObserversProtocol这三个来发送位置更新,我正在演示协议方式,见下文

首先,您可以为您的GPS_Obtainer 类创建一个Singleton,如下所示。

GPS_Obtainer.h

#import "GPS_Obtainer.h"

#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>

@protocol GPS_ObtainerDelegate <NSObject>

-(void)locationDidUpdated:(CLLocation *)location;

@end

@interface GPS_Obtainer : NSObject

@property (nonatomic, strong) id<GPS_ObtainerDelegate> delegate;

+ (GPS_Obainer*)sharedSingleton;

@end

GPS_Obtainer.m

@interface GPS_Obtainer()<CLLocationManagerDelegate>

@property (nonatomic, strong) CLLocationManager* locationManager;

@end

@implementation GPS_Obtainer

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

    if(self) {
        self.locationManager = [CLLocationManager new];
        [self.locationManager setDelegate:self];
        [self.locationManager startUpdatingLocation];
    }

    return self;
}

+ (GPS_Obtainer*)sharedSingleton {

    static GPS_Obtainer *sharedSingleton = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
       sharedSingleton = [GPS_Obtainer new];
    });
    return sharedSingleton;
}

#pragma mark - CLLocationManagerDelegate

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

}

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

      if(self.delegate && [self.delegate respondsToSelector:@selector(locationDidUpdated:)]){
            [self.delegate locationDidUpdated:newLocation];
      }

}

@end

然后你只需要在 ViewController 中设置类的委托,它将像下面这样接收它

ViewController.m

-(void)viewDidLoad{
     [[GPS_Obtainer sharedSingleton] setDelegate:self];
}

-(void)locationDidUpdated:(CLLocation *)location{
    //HERE you get the location updates
}

-(void)dealloc{
  [[GPS_Obtainer sharedSingleton] setDelegate:nil];
}

希望以上有所帮助。

干杯。

【讨论】:

  • 嗨,伙计,非常感谢您的帮助,并且效果很好...就单例而言,这是我第一次看到这种设计模式,请您解释一下它背后的机制?:)
  • Singleton -> 只创建一次,所以当你调用 [GPS_Obtainer sharedSingleton] 时,如果不存在类创建的对象,并且在多次调用时它只会使用该对象,因为我们需要 locationmanager您的情况是 GPS_Obtainer 始终运行而无需每次都对其进行初始化,因此最好在这里使用单例,同样您可以将单例用于数据库操作。协议 - 我希望你知道。
  • 我不太明白,因为 shareSingleton 是一个类方法
  • shareSingleton是类的静态方法,在objective-c中你通常会使用很多单例,比如[NSFileManager defaultManager];[UIApplication sharedApplication],单例是大多数设计模式中常用的语言,您需要阅读一些文档like this 了解更多信息。
  • 感谢您的建议和帮助队友,如您所知,我只是一个初学者 :) ...所以,基本上,sharedSingleton 方法在 VC 中返回一个 GPS-obtainer 对象,并将其委托设置为做VC。因为delegate很强大,我必须在VC被dealloc之前重新分配它……对吗?
猜你喜欢
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-04
相关资源
最近更新 更多