2012-01-18 8 views
0

私は、MapKitとiOSの注釈を使って作業しています。注釈が追加される直前(しばらく時間がかかることがあります)に、小さな「読み込み中...」UIViewを表示したいと思います。スレッディングなしでこれを行うと、ローディングビューはあまりにも遅れて、それが解消される前にほとんど表示されません。 performSelectorInBackgroundを使用して注釈を読み込むと、数回試行するたびに動作し、残りのUIViewは表示されますが、mapView:didAddAnnotationViews:が呼び出されても注釈は表示されません。なぜこれが予測できないほどに行動するのか誰もが考えることができますか?あなたはrefreshAnnosで何をしますかperformSelectorInBackgroundとMapKit

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

答えて

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; 
     }); 
    }); 
+0

1を使用して、次のデザインパターンを試すことができ、GCDは、ほとんどの場合performSelectorInBackground' 'よりも優れたソリューションです。 – DarkDust

+1

しかし、 'DISPATCH_QUEUE_PRIORITY_BACKGROUND'はiOS 5以降でのみ利用可能であることに注意してください。また、 'DISPATCH_QUEUE_PRIORITY_LOW'と同様にiOS 4をサポートする方が良い解決法かもしれません。 – DarkDust

1

これは、それが助け場合、私は、それを呼んでいる方法ですか?

マップビューにアノテーションを追加している場合は、バックグラウンドスレッドのためにアノテーションが機能しません。メインスレッド内のマップビューを更新する必要があります。ベスト

、 クリスチャン