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

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

10-06 00:16