从解析加载对象并显示在地图上

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。这会将块添加到下一个 运行 循环,在当前循环之后执行。