我在我的项目中使用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
,它可以正常运行。但是我使用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
请帮帮我。
答案 0 :(得分:3)
您无法从后台线程访问UIViews而不会有崩溃的风险。由于self.mapView
是UIView,因此从异步调度队列中运行的块访问它是不安全的。
要在主线程上执行此批量版本,您需要将其分解为许多较小的操作。最简单的方法是创建一个NSBlockOperation,其中包含100个转换列表,并根据需要为整个列表创建尽可能多的操作。然后,您可以在[NSOperationQueue mainQueue]上排队,以便在主线程上执行。