【问题标题】:iOS designing this logic/workflow involving CoreLocation, web service calls, loading UIiOS 设计此逻辑/工作流程涉及 CoreLocation、Web 服务调用、加载 UI
【发布时间】:2012-07-20 05:04:13
【问题描述】:

我处理这个问题已经有一段时间了,我需要一些帮助来设计我的逻辑。

我想按这个顺序做三件事 1)获取用户的位置 2) 使用该用户的位置调用 Web 服务 3) 用结果加载用户界面

我希望它的设计方式让我可以轻松地刷新结果,因此如果用户按下刷新按钮,我会再次执行步骤 1-3。

现在,我这样做如下。这是我在 ViewController 中的代码。

- (void) viewDidLoad {
    //initialize CLLocationManager
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    self.locationManager.delegate = self;
    [self.locationManager startUpdatingLocation];

- (void) locationManager: (CLLocationManager *)manager 
     didUpdateToLocation: (CLLocation *)newLocation
            fromLocation:(CLLocation *)oldLocation
{
    if (oldLocation!= nil) { // make sure to wait until second latlong value
        [self setLatitude:newLocation.coordinate.latitude];
        [self setLongitude: newLocation.coordinate.longitude];
        [self.locationManager stopUpdatingLocation];
        self.locationManager.delegate = nil;
        [self makeUseOfLocationWithLat:[self getLatitude] andLon:[self getLongitude]];
}

- (void) makeUseOfLocationWithLat: (double) lat andLon: (double) lon {
    // call web service
    [self loadUI];
}

- (void) loadUI {
     // loads the user interface
}

如果我错了,请纠正我,但我的设计真的很糟糕。它根本不是模块化的,每种方法都是相互关联的。此外,我在 ViewController 中进行密集的 Web 服务调用,而不是在任何模型类中。您如何正确设置它? 我遇到的主要问题之一是......我不知道我的纬度和经度变量何时获得它们的值。如果我不从我的委托方法调用 makeUseOfLocation,那么我最终会使用 nil 纬度和经度值调用 makeUseOfLocation。

我已经为我的位置管理、NSKeyValueObserving 协议、dispatch_queues、NSOperations 研究了单例,但我是在 iOS 上开发的新手,无论我尝试什么,我都会卡在某个地方。请让我知道您对如何设置的想法。

感谢您的宝贵时间,我真的很感激。

【问题讨论】:

    标签: ios xcode model-view-controller user-interface core-location


    【解决方案1】:

    如果您真的想将其分开,作为简单的第一步,我会执行以下操作:

    • 创建一个新类,例如 LocationTracker
    • 使 LocationTracker 成为 CLLocationManager 的委托,可能在它的 init 方法中
    • 让 LocationTracker 订阅 NSNotification “myapp.location.refresh”
    • 让您的 ViewController 订阅“myapp.location.updated”
    • 当 CLLocationManager 提供 didUpdate 时,发布“myapp.location.updated”
    • 按下刷新按钮后,发布“myapp.location.refresh”
    • 当通知“myapp.location.refresh”时,强制更新

    这会在您的位置跟踪类和控制器之间创建一个小协议。 NSNotification 文档非常好,它们会带你到那里。

    您可以让控制器拥有实例或应用程序委托。我不认为单例真的那么必要。

    您也可以使用键值观察,或协议/委托类型设置,它们中的任何一个都可以工作,因为它们基本上都是相同的模式(观察者)。

    【讨论】:

      猜你喜欢
      • 2015-08-06
      • 2019-06-01
      • 2016-07-26
      • 2013-01-10
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      相关资源
      最近更新 更多