objective-c - cocoa :使用dispatch_async错误

标签 objective-c cocoa grand-central-dispatch

我在我的项目中使用 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

请帮助我。

最佳答案

您无法从后台线程访问 UIView,否则会有崩溃的风险。由于 self.mapView 是一个 UIView,因此从异步调度队列中运行的 block 访问它是不安全的。

要在主线程上执行此操作的批量版本,您需要将其分解为许多较小的操作。最简单的方法可能是创建一个 NSBlockOperation,它需要一个包含 100 个点的列表来进行转换,然后根据整个列表的需要创建尽可能多的操作。然后,您可以将它们排队到 [NSOperationQueue mainQueue] 上,以便在主线程上执行。

关于objective-c - cocoa :使用dispatch_async错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11976771/

相关文章:

ios - 如何解析 NSArray 以仅获取每个数组条目的一部分?

objective-c - 如何更改 Xcode 应用程序的外观?

cocoa - 更改 CALayer 属性的动画时间

ios - 新任务不等待GCD Barriers

ios - 如何在后台线程中快速将普通数组保存到 Realm 中

ios - 面临解析谷歌位置响应的困难

objective-c - UINavigationBar 可编辑标题?

ios - 为每个线程创建EAGLContext可以吗?

ios - UICollectionView reloadData 更改单元格顺序

objective-c - 当 alpha 为 1.0 时,OpenGL ES Faces 看起来是透明的?