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

时间:2015-06-04 23:21:33

标签: ios objective-c parse-platform mapkit

使用应用程序,允许用户查看当地人发布的内容(企业,学校或仅限人员)。我可以发布信息并将其保存到解析中。我也能够在当前位置附近下载用户数据,但问题是我的帮助方法在应用程序首次启动时不会立即执行。

我试图在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;

        }];
    }];
}

1 个答案:

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