从解析加载对象并显示在地图上
load objects from parse and display on map
开发一款允许用户查看当地人post编辑过的应用程序(企业、学校或只是个人)。我能够 post 信息并将其保存以进行解析。我还可以下载当前位置附近的用户数据,但问题是我的辅助方法不会在应用程序首次启动时立即执行此操作。
我尝试在 viewDidLoad、viewWillAppear 和 viewDidAppear 中调用下面的辅助方法,但没有成功。当用户最初打开应用程序并转到地图时,postArray 始终为 null。如果我移动到另一个屏幕并返回到 mapVC,数据就在那里......(我 NSlog postArray)并且打印出当前位置附近的所有 posts。当地图显示用户的位置时,我希望这些数据最初是正确的。
问题。
- 我应该在哪里调用我的辅助方法?当应用程序启动时,我想
有数据,所以我可以在地图上显示它。
- 我还需要编写其他方法吗?
- 是不是现在的方法有问题
- (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
。这会将块添加到下一个 运行 循环,在当前循环之后执行。
开发一款允许用户查看当地人post编辑过的应用程序(企业、学校或只是个人)。我能够 post 信息并将其保存以进行解析。我还可以下载当前位置附近的用户数据,但问题是我的辅助方法不会在应用程序首次启动时立即执行此操作。
我尝试在 viewDidLoad、viewWillAppear 和 viewDidAppear 中调用下面的辅助方法,但没有成功。当用户最初打开应用程序并转到地图时,postArray 始终为 null。如果我移动到另一个屏幕并返回到 mapVC,数据就在那里......(我 NSlog postArray)并且打印出当前位置附近的所有 posts。当地图显示用户的位置时,我希望这些数据最初是正确的。
问题。
- 我应该在哪里调用我的辅助方法?当应用程序启动时,我想 有数据,所以我可以在地图上显示它。
- 我还需要编写其他方法吗?
- 是不是现在的方法有问题
- (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
。这会将块添加到下一个 运行 循环,在当前循环之后执行。