Michael

写写代码,说说人生

您好,我是Michael,欢迎来到我的个人家园。
代码搬运工,目前就职于XX证券,努力修行中。


H5 / Java / Objc / Swift / Vue / RN

主线程问题:提醒Main Thread Checker,关于UI API called on a background thread的解释

主线程问题:提醒Main Thread Checker: UI API called on a background thread的解释

一般做服务端的人基本没有MainThread和 BackgroundThread的概念,但是这个概念在客户端中是非常重要的,因为客户端不管安卓还是iOS,UI刷新需要始终占用主线程去刷新,如果一旦占用bg线程,虽然不会发生致命错误,但是也会提示这种warning级别的报错; 同样,如果我们把一些本应该在bg中执行的网络请求放在了Main中,那么会导致UI停止刷新,双方执行了sync操作,体验非常差,这是不规范的操作。

所以

Main Thread Checker: UI API called on a background thread...
Xcode 9 [UIView initWithFrame:] must be used from main thread only

这种错误就是需要查看你代码中有没有UI刷新操作没有强制主线程更新的。

解决方法

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    UIImage * snapShot = [self generateShadowImage];
    dispatch_async(dispatch_get_main_queue(), ^{
        imageView.image = snapShot;
    });
});

...

- (UIImage *)generateShadowImage
{
    // It crashes here:
    UIView * shadowView = [[UIView alloc] initWithFrame:CGRectZero];
    ...
}

官网解决方法:http://quabr.com/46362641/xcode-9-uiview-initwithframe-must-be-used-from-main-thread-only

更早的文章

关于translatesAutoresizingMaskIntoConstraints属性的认知

translatesAutoresizingMaskIntoConstraints 把 autoresizingMask 转换为 Constraints 即:可以把 frame ,bouds,center 方式布局的视图自动转化为约束形式。(此时该视图上约束已经足够 不需要手动去添加别的约束) 用代码创建的所有view , translatesAutoresizingMaskIntoConstraints 默认是 YES 用 IB 创建的所有 view ,translatesAu...…

iOS开发继续阅读