performSelectorInBackground和MapKit

时间:2012-01-18 09:12:33

标签: objective-c ios mkannotationview mapkit

我在iOS中使用MapKit和注释。在添加注释之前(可能需要一段时间),我想显示一个小的“正在加载......”UIView。如果我在没有线程的情况下执行此操作,则加载视图会滞后以至于在它被解除之前几乎不会出现。如果我使用performSelectorInBackground加载注释,它将每隔几次尝试工作,UIView的其余部分将出现但没有注释,即使调用了mapView:didAddAnnotationViews:。任何人都可以想到为什么会出现如此不可预测的行为?

这就是我调用它的方式,如果它有帮助:

[self performSelectorInBackground:@selector(refreshAnnos) withObject:nil];

2 个答案:

答案 0 :(得分:2)

您可以在后台加载注释,但是您应该始终在主线程上添加注释。

这就是为什么

     mapView:didAddAnnotationViews: 

被调用,但不会传播到UI。它与在后台调用UITableViewDelegate方法相同。

您可以使用GCD尝试以下设计模式

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
       //Load the annotations on the background queue;
        dispatch_async(dispatch_get_main_queue(), ^{
           //add the annotations to the mapView; 
        });
    });

答案 1 :(得分:1)

你在refreshAnnos做了什么?

如果您在那里添加注释到mapview,它将无法工作(因为后台线程)。您需要更新主线程内的mapview。

最佳, 基督教