添加/重新加载地图视图注释而不阻塞主线程

akd*_*uza 5 iphone annotations asynchronous reload mkmapview

我可以在第一次完美地加载带有注释的地图视图。但是,如果我尝试通过单击按钮重新加载地图(在它已经加载之后),用户必须等到该过程完成。出现此问题是因为在重新加载时,新的注释不会出现,直到 mapview 显着移动,即viewForAnnotation触发时。我已经看到了另外两个与我的问题类似的问题,其解决方案涉及“ performSelectorInBackground ”和“ performSelectorOnMainThread ”'。前者对我不起作用:(&后者我不想做(尽管它是唯一有效的选项),因为我希望用户能够在加载注释时与地图交互而不阻塞主线程。我我知道这样的动画最好在主线程上完成,所以问题 1. 除了让用户等待地图重新加载之外,还有没有其他方法可以做到这一点? 2. 关于最佳方法的建议?提前致谢。

Krr*_*ish 4

您可以使用调度队列块来实现此目的,这是语法
您可以像这样创建您的私有队列

dispatch_queue_t queue = dispatch_queue_create("com.MyApp.AppTask",NULL);
dispatch_queue_t main = dispatch_get_main_queue();
    dispatch_async(queue, 
    ^{
        //do the fetching of data here(Don't do any UI Updates)
        dispatch_async(main, 
        ^{
           // Do the UI Update here.
         });

     });
Run Code Online (Sandbox Code Playgroud)

Apple 将此称为递归分解。
在这段代码中,计算被卸载到后台线程上 ,然后dispatch_async()返回主队列,主队列将安排我们的块使用我们在后台线程中计算的更新数据运行。
dispatch_async()

  • 不幸的是,这并不能解决同时添加/删除 100 个注释的问题。正如你所说,所有 UI 操作都必须在主线程中。解决方案就是通过集群或其他方式(显示最靠近屏幕中心的前 50 个)来限制屏幕上同时显示的引脚数量。 (2认同)