0

我有這樣一段代碼管理「拉刷新」,它更新了設備的位置:dispatch_after CLLocationManager didUpdateLocations或didFailWithError

[self.glassScrollView.foregroundScrollView 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){ 

     NSLog(@"Pulled"); 
     [weakSelf.locationManager startUpdatingLocation]; 
     [weakForegroundScrollView.pullToRefreshView stopAnimating]; 
    }); 
}]; 

當它啓動時更新動畫停止的位置,而不是在它實際更新位置或返回錯誤。這造成了它似乎已經更新位置和UI(旋轉輪動畫消失)的尷尬情況,但它仍然通過CLLocationManagerDelegate方法處理它。

那麼,用這個隊列「連接」locationManager:didUpdateLocationslocationManager:didFailWithError方法的最佳方法是什麼? 我正在考慮在上面的代碼中添加某種「偵聽器」,等待在CLLocationManagerDelegate方法中調用某個方法。

這裏還有我的locationManager:didUpdateLocations方法。

(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 

{ 
    NSLog(@"didUpdateLocations"); 
    CLLocation *currentLocation = [locations lastObject]; 
    // do stuff in the UI 

    // I stop updating the location to save battery 
    [self.locationManager stopUpdatingLocation]; 
} 

謝謝!

+1

你爲什麼不只是把[weakForegroundScrollView.pullToRefreshView stopAnimating];在didUpdateLocations裏面?或didFailWithError? – Ricky

+0

您是否在使用'SVPullToRefresh'?或者其他一些拉到刷新控制? – Rob

+0

@Ricky這可能是一個解決方案,但隨着我的應用程序的增長,我會擴大'pull to refresh'動作到其他方法,所以它不僅僅是更新位置。謝謝! – Giovanni

回答

0

好的。此代碼可以幫助: -

-(void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(whenCompleted) name:@"whenCompleted" object:nil]; 
} 

-(void)viewWillDisappear:(BOOL)animated{ 
    [super viewWillDisappear:animated]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"whenCompleted" object:nil]; 
} 

-(void)whenCompleted{ 
    [weakForegroundScrollView.pullToRefreshView stopAnimating]; 
} 

當所有的方法都最後的方法結束前執行,發佈通知: -

[[NSNotificationCenter defaultCenter]postNotificationName:@"whenCompleted" object:nil]; 

然後,它會stopAnimating時進度完成。

0

您處理拉入請求的東西,如:

[self.glassScrollView.foregroundScrollView 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){ 

     NSLog(@"Pulled"); 
     [weakSelf.locationManager startUpdatingLocation]; 
     [weakForegroundScrollView.pullToRefreshView stopAnimating]; 
    }); 
}]; 

我假設一秒的延遲是因爲你要隱藏的拉動在一秒鐘後刷新,即使刷新仍在進行中。

什麼我建議是:

[self.glassScrollView.foregroundScrollView addPullToRefreshWithActionHandler:^{ 

    [weakSelf.locationManager startUpdatingLocation]; 

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5 * NSEC_PER_SEC);, dispatch_get_main_queue(), ^(void){ 
     [weakSelf.glassScrollView.foregroundScrollView setContentOffset:CGPointZero animated:YES]; 
    }); 
}]; 

這樣可以使UIActivityIndicatorView紡紗,但它滾動關閉屏幕。如果你再次拉下它,你會看到它仍在繼續。這是一種簡單的方法來保持活動指示器的運行,但是要將它從用戶的方式中解放出來。

然後,正如Ricky所說,只有當檢索到位置時,您纔會stopAnimating(或發佈本地通知到[NSNotificationCenter defaultCenter],以便您的觀察者可以這樣做)。但是,請不要在一段時間後嘗試stopAnimating,而應該將其與您正在執行的任何異步任務的實際完成情況聯繫起來。