0

プロジェクトで Oomph mapkit を使用しています。私のコードは次のとおりです。

dispatch_queue_t pQueue = dispatch_queue_create("pQueue", NULL);
dispatch_async(pQueue, ^(void){
    CLLocationCoordinate2D coordinate= [self.mapView convertPoint:point toCoordinateFromView:self];
});

これはポイントを緯度と経度に変換するだけです。を使用すればdispatch_sync、正しく実行できます。しかし、II を使用するdispatch_asyncと、プログラムがクラッシュします。

エラー:

1   0x7fff91c6e067 WTF::Vector<JSC::Identifier, 64ul>::shrinkCapacity(unsigned long)
2   0x7fff91c6df5e JSC::ParserArena::reset()
3   0x7fff91d881ea JSC::ScopeNode::destroyData()
4   0x7fff91d87b3d JSC::FunctionExecutable::produceCodeBlockFor(JSC::ScopeChainNode*,     JSC::CompilationKind, JSC::CodeSpecializationKind, JSC::JSObject*&)
5   0x7fff91d8751c JSC::FunctionExecutable::compileForCallInternal(JSC::ExecState*, JSC::ScopeChainNode*, JSC::JITCode::JITType)
6   0x7fff91c75a84 JSC::Interpreter::executeCall(JSC::ExecState*, JSC::JSObject*, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&)
7   0x7fff91c75924 JSC::call(JSC::ExecState*, JSC::JSValue, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&)
8   0x7fff8e7eac76 WebCore::JSMainThreadExecState::call(JSC::ExecState*, JSC::JSValue, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&)
9   0x7fff8e0c71f2 -[WebScriptObject callWebScriptMethod:withArguments:]
10  0x100090bda -[MKMapView convertPoint:toCoordinateFromView:]
11  0x100033fa7 __51-[MKMapView(MKGeometryExtensions) clusterAnimated:]_block_invoke_0
12  0x7fff8da81f3d _dispatch_call_block_and_release
13  0x7fff8da7e0fa _dispatch_client_callout
14  0x7fff8da7f4c3 _dispatch_queue_drain
15  0x7fff8da7f335 _dispatch_queue_invoke
16  0x7fff8da7f207 _dispatch_worker_thread2
17  0x7fff893b1ceb _pthread_wqthread
18  0x7fff8939c1b1 start_wqthread

私を助けてください。

4

1 に答える 1

3

クラッシュの危険を冒さずにバックグラウンド スレッドから UIView にアクセスすることはできません。は UIView であるためself.mapView、非同期ディスパッチ キューで実行されているブロックからアクセスするのは安全ではありません。

これをメイン スレッドで一括実行するには、これを多くの小さな操作に分割する必要があります。おそらく、変換する 100 ポイントのリストを取得する NSBlockOperation を作成し、リスト全体に必要な数の操作を作成するのが最も簡単です。その後、メイン スレッドで実行するために [NSOperationQueue mainQueue] でそれらをキューに入れることができます。

于 2012-08-15T20:52:02.077 に答える