使用应用程序,允许用户查看当地人发布的内容(企业,学校或仅限人员)。我可以发布信息并将其保存到解析中。我也能够在当前位置附近下载用户数据,但问题是我的帮助方法在应用程序首次启动时不会立即执行。
我试图在viewDidLoad,viewWillAppear和viewDidAppear中调用下面的helper方法,但没有运气。当用户最初打开应用程序并转到地图时,postArray始终为null。如果我移动到另一个屏幕并返回到mapVC,那么数据就在那里......(我在postArray上发布了NSlog)并打印出当前位置附近的所有帖子。我想在地图显示用户位置时最初获得此数据。
问题。
- (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;
}];
}];
}
答案 0 :(得分: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
。这会将块添加到下一个运行循环,以便在当前循环之后执行。