2015-06-04 52 views
0

使用應用程序時,用戶可以查看當地人發佈的內容(企業,學校或只是人)。我可以發佈信息並將其保存爲解析。我也能夠在當前位置附近下載用戶數據,但問題在於,當應用第一次啓動時,我的幫助程序方法不會立即執行。加載解析對象並在地圖上顯示

我曾嘗試在viewDidLoad,viewWillAppear和viewDidAppear中調用下面的幫助方法,但沒有運氣。當用戶最初打開應用程序並轉到地圖時,postArray始終爲空。如果我移動到另一個屏幕並返回到mapVC,那麼數據就在那裏......(我NSlog postArray),並打印出當前位置附近的所有帖子。當地圖顯示用戶的位置時,我希望最初有這些數據。

問題。

  • 我應該在哪裏打電話給我的幫手方法?當應用程序啓動時,我想要 有數據,所以我可以在地圖上顯示它。
  • 我還需要寫另一種方法嗎?
  • 目前的方法有問題嗎?

- (void)loadLocalPosts { 
    NSLog(@"Querying for Local Posts"); 
    [activityIndicator startAnimating]; 
    PFQuery *query = [PFQuery queryWithClassName:@"Post"]; 
    [PFGeoPoint geoPointForCurrentLocationInBackground:^(PFGeoPoint *geoPoint, NSError 
                 *error) { 
     geopoint = geoPoint; 
     [query whereKey:@"location" nearGeoPoint:geoPoint]; 
     [query setLimit:50]; 
     [query addDescendingOrder:@"createdAt"]; 
     [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
      postArray = objects; 

     }]; 
    }]; 
} 

回答

1

這裏的問題是,postArray在後臺線程填充和您的應用程序初始化比它可以填充陣列更快。這在異步編程中很常見。解決這個問題的方法是要求地圖在主線程中刷新

- (void)loadLocalPosts { 
    NSLog(@"Querying for Local Posts"); 
    [activityIndicator startAnimating]; 
    PFQuery *query = [PFQuery queryWithClassName:@"Post"]; 
    [PFGeoPoint geoPointForCurrentLocationInBackground:^(PFGeoPoint *geoPoint, NSError 
                 *error) { 
     geopoint = geoPoint; 
     [query whereKey:@"location" nearGeoPoint:geoPoint]; 
     [query setLimit:50]; 
     [query addDescendingOrder:@"createdAt"]; 
     [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
      postArray = objects; 
      dispatch_async(dispatch_get_main_queue(),^ 
      { 
       // update view properties, refresh etc. 
      }); 
     }]; 
}]; 

}

注:所有視圖相關的修改應在主線程中總是發生。因此dispatch_get_main_queue()。但是現在主循環可以做視圖相關的操作,因此同步調用會使應用程序崩潰。因此使用dispatch_async。這會將該塊添加到下一個要在當前執行後執行的運行循環中。

+0

有意義 - 它工作。非常感謝! – Ronaldoh1

+0

這是使用dispatch_get_main_queue()的一個很好的例子。現在變得更有意義了。我有其他方法,即從數據分析中提取數據。我相信我可以使用相同的概念 - 謝謝! – Ronaldoh1

相關問題