ios - 从解析加载对象并显示在 map 上

标签 ios objective-c parse-platform mapkit

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

我尝试在 viewDidLoad、viewWillAppear 和 viewDidAppear 中调用下面的辅助方法,但没有成功。当用户最初打开应用程序并转到 map 时,postArray 始终为 null。如果我移动到另一个屏幕并返回到 mapVC,数据就在那里......(我 NSlog the postArray)并且打印出当前位置附近的所有帖子。本地图显示用户的位置时,我希望最初就拥有这些数据。

问题。

  • 我应该在哪里调用我的辅助方法?当应用程序启动时,我想 有数据,所以我可以在 map 上显示它。
  • 我需要编写另一种方法吗?
  • 是不是现在的方法有问题。

- (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 是在后台线程中填充的,您的应用程序初始化速度快于填充数组的速度。这在异步编程中很常见。解决此问题的方法是让 map 在主线程中 刷新。

- (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.
            });
        }];
}];

注意:所有与 View 相关的修改都应始终发生在主线程中。因此 dispatch_get_main_queue()。但是,现在主循环可能正在执行与 View 相关的操作,因此同步调用会使应用程序崩溃。因此使用了 dispatch_async。这会将 block 添加到下一个运行循环,以便在当前运行循环之后执行。

关于ios - 从解析加载对象并显示在 map 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30655829/

相关文章:

ios - Swift 使用来自 Parse 的数据解包 Optional 值时出现 fatal error

ios - 如何在没有警报的情况下发送 Parse 推送通知?

iphone - 在 Resources 文件夹下添加 iOS 图标和启动图像

iphone - 如何解决在类型为 "AppDelegate"的对象上找不到属性数组错误

iphone - iPad 应用程序中奇怪的 UINavigationController 行为

objective-c - 我的应用程序可以使用多少内存?或者什么是通常的?

ios - reloadData之后的indexPath.row错误

javascript - 将 Parse JavaScript SDK 与 Google Chrome 应用程序结合使用

php - 如何将 NSString 从 JSON 转换为 NSDictionary?

ios - 设计一个可测试的 Objective-C 类