添加/重新加载mapview注释而不阻塞主线程

时间:2012-02-07 07:23:34

标签: iphone asynchronous annotations mkmapview reload

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

1 个答案:

答案 0 :(得分: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.
         });

     });

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