在'pull to refresh'中完成位置提取?

时间:2013-10-16 15:14:32

标签: objective-c cllocationmanager pull-to-refresh

我已经在我的应用程序中实现了pull刷新,当拉动启动位置管理器以获得用户位置的修复时,然后呈现一个显示该位置的模态视图控制器。

我遇到的问题是模态视图控制器在获取用户位置之前呈现,导致空白地图再持续几秒钟,直到获得并更新。

我有一个属性,用于保存用户当前位置。在刷新调用'showMap'之前,是否有可能'保持'直到该属性不是nil(即已建立位置),也许如果它在设定的时间后找不到用户它可能只是出现错误?我尝试使用'while'循环来不断检查currentLocation属性,但这似乎不是正确的事情,并且无论如何都不起作用。

这是我在viewDidLoad中设置的刷新代码:

__typeof (&*self) __weak weakSelf = self;

[self.scrollView addPullToRefreshWithActionHandler:^ {
    int64_t delayInSeconds = 1.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [weakSelf showMap];
    });
}];

当使用pull to refresh时,它会调用以下方法:

- (void)showMap
{
    [self.locationManager updateCurrentLocation];

    [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(finishRefresh) userInfo:nil repeats:NO];

}

- (void)finishRefresh
{
    [self.scrollView.pullToRefreshController didFinishRefresh];

    [self performSegueWithIdentifier:@"showMap" sender:self];
}

1 个答案:

答案 0 :(得分:0)

摘要

为避免过早显示地图,您应该等待异步更新操作,并且最干净的模式将是委派。关于它在Cocoa / Cocoa Touch中的应用,这里是a nice Apple Doc

然后它将大致像这样工作:

  1. Pull-to-Refresh触发位置更新。
  2. 完成位置更新后,locationManager会通知您的控制器,控制器会显示地图。
  3. 如何做到

    我不知道您的位置管理器类的接口,但如果它是CLLocationManager,则可以通过这种方式完成。

    CLLocationManager具有委托属性。您的视图控制器应该:

    1. 符合CLLocationManagerDelegate protocol
    2. 将自己添加为locationManager
    3. 的代理人
    4. 实现locationManager:didUpdateLocations:方法 - 当位置数据到达并准备好使用时,它会被调用。
    5. 此方法的实现应该大致如下:

      - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
      {
          /*
           *  shouldShowMap — BOOL property of View Controller, actually optional 
           *  but allowing to filter out handling of unwanted location updates 
           *  so they will not trigger map segue every time
           */
          if (self.shouldShowMap) {
              [self performSegueWithIdentifier:@"showMap" sender:self];
              self.shouldShowMap = NO; 
          }
          // stop updating location — you need only one update, not a stream of consecutive updates
          [self.locationManager stopUpdatingLocation];
      }
      

      您的Pull-to-Refresh处理程序应如下所示:

      __typeof (&*self) __weak weakSelf = self;
      
      [self.scrollView addPullToRefreshWithActionHandler:^ {
          self.shouldShowMap = YES;
          [weakSelf.locationManager startUpdatingLocation];
      }];
      

      希望它有所帮助。最好的学习方法(好吧,在大多数案例中)是研究如何在系统框架中实现内容。从这个方向思考,你肯定会想出一个解决方案:)

      如果您需要澄清,请随时提出,我可能没有清楚地解释清楚。