1

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

我想按此顺序做三件事 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 ,那么我最终会调用 makeUseOfLocation 并使用latitude 和 longitude 的 nil 值

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

谢谢你的时间,我真的很感激。

4

1 回答 1

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 文档非常好,它们会让你到达那里。

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

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

于 2012-07-20T22:32:40.283 回答