2012-02-07 76 views
4

我可以在第一次使用注释完美载入我的地图视图。但是,如果我尝试重新加载按钮上的地图(已经加载后),用户必须等到该过程完成。 这个问题的产生是因为重新加载时,新的注释不会出现,直到mapview被显着移动,这就是当触发viewForAnnotation时。我见过两个类似于我的解决方案,其中涉及'performSelectorInBackground'&'performSelectorOnMainThread'。前者没有为我工作:(&后者我不想这样做(虽然它是唯一的选项),因为我希望用户能够与地图交互,而注解加载而不会阻塞主线程。 m意识到这样的动画最好在主线程中完成,所以问题1.是否没有其他方法可以做,而不是让用户等待地图重新加载?2.有关最佳方式的建议? 在此先感谢。在不阻挡主线程的情况下添加/重新加载mapview注释

回答

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

    }); 

苹果已经将此称为递归分解。
在该位的代码计算被卸载到一个后台线程与dispatch_async()
然后dispatch_async()回主队列将安排我们的块与我们在后台线程计算的最新数据运行。

+0

我有点短时间来尝试这个,所以我最终在后台线程中获取数据并在主线程中显示注释。派遣队列可能类似的方法。因此将其标记为解决方案。 – akdsouza 2012-02-09 11:23:05

+2

不幸的是,这并不能解决同时添加/删除100个注释的问题。正如你所说,所有的UI操作都必须在主线程中。解决这个问题的办法是一次性限制屏幕上的引脚数量,或者通过集群或其他方式(显示距离屏幕中心最近的前50)。 – Sean 2012-10-09 04:48:25

+1

也看不到需要一个单独的队列,只需使用dispatch_get_global_queue – aryaxt 2014-06-09 00:22:58

相关问题