美文网首页
iOS 在主线程操作UI不能保证安全

iOS 在主线程操作UI不能保证安全

作者: Pandakingli | 来源:发表于2018-10-15 21:16 被阅读0次

先看一下SDWebImage的一段代码

#ifndef dispatch_queue_async_safe
#define dispatch_queue_async_safe(queue, block)\
    if (dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL) == dispatch_queue_get_label(queue)) {\
        block();\
    } else {\
        dispatch_async(queue, block);\
    }
#endif

#ifndef dispatch_main_async_safe
#define dispatch_main_async_safe(block) dispatch_queue_async_safe(dispatch_get_main_queue(), block)
#endif

是不是很奇怪,一般来说下面的代码就足够了啊,可以保证在主线程运行

if ([NSThread isMainThread]) {
       block();
} else {
   dispatch_async(dispatch_get_main_queue(), ^{
       block();
   })
}

github issues上看到下面的讨论:


24025596: MapKit: It's not safe to call MKMapView's addOverlay on a non-main-queue, even if it is executed on the main thread #7053

在非主队列中调用MKMapView的 addOverlay方法是不安全的,即使是在主线程,也有可能造成崩溃。

@NachoSoto I contacted Apple DTS, they confirmed it is a bug in MapKit. But they also cautioned that the pattern of dispatch_sync and the isMainThread will likely run into more issues like this and the one reported by @laptobbe above.

They also explicitly stated that main queue and the main thread are not the same thing, but are have subtle differences, as shown in my demo app.

UI 主线程执行不一定安全.png

在主队列中的任务,一定会放到主线程执行
所以只要是在主队列中的任务,既可以保证在主队列,也可以保证在主线程中执行。所以就可以通过判断当前队列是不是主队列来代替判断当前执行任务的线程是否是主线程,这样会更加安全。

相关文章

  • iOS 在主线程操作UI不能保证安全

    先看一下SDWebImage的一段代码 是不是很奇怪,一般来说下面的代码就足够了啊,可以保证在主线程运行 在git...

  • 网络多线程

    怎么保证线程安全?只在主线程刷新UI。防止线程资源抢夺,要用@synchronized进行加锁保护。异步操作保证线...

  • GCD

    GCD 队列与线程的关系 主队列和主线程 『ios』主线程 和 主队列的关系,绝对安全的UI操作,主线程中一定是主...

  • Handler

    Handler机制: 是一个消息传递机制,作用是将子线程需要的UI操作,传递到UI线程执行,保证线程安全。 相关类...

  • iOS下FMDB的多线程操作(一)

    iOS中一些时间比较长的操作都应该放在子线程中,以避免UI的卡顿。而sqlite 是非线程安全的,故在多线程中不能...

  • iOS-检测UI主线程小工具

    在iOS开发中需要保证所有UI操作一定是在主线程进行,通过 hook UIView的-setNeedsLayout...

  • Android-异步操作更新UI界面的几种方法

    在Android开发中,耗时操作是比较多的,更新ui需要在主线程中,然而耗时操作是不能放在主UI线程中在执行的,因...

  • iOS子线程操作UI

    首先声明一点:子线程里面是可以更新UI的。 之所以说子线程不能操作UI是因为UIKit不是线程安全的。UI操作涉及...

  • 主线程中也不绝对安全的 UI 操作

    主线程中也不绝对安全的 UI 操作 主线程中也不绝对安全的 UI 操作

  • 2018-07-12

    volatile不能保证原子性,所以用它修饰的变量,如果执行非原子性操作,那不能保证线程安全,比如++操作,但是=...

网友评论

      本文标题:iOS 在主线程操作UI不能保证安全

      本文链接:https://www.haomeiwen.com/subject/yfuqzftx.html