使用允许用户查看本地人(企业,学校或仅仅是人)发布的内容的应用程序。我能够发布信息并将其保存以进行分析。我还可以在当前位置附近下载用户数据,但是问题是我的助手方法在应用程序首次启动时不会立即执行操作。
我试图在viewDidLoad,viewWillAppear和viewDidAppear中调用以下辅助方法,但没有运气。当用户最初打开应用程序并转到地图时,postArray始终为null。如果我移到另一个屏幕并返回到mapVC,则数据在那里...(我将日志记录在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;
}];
}];
}
最佳答案
这里的问题是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
。这会将块添加到当前块之后要执行的下一个运行循环中。