【问题标题】:CoreAnimation: warning, deleted thread with uncommitted CATransaction created by:CoreAnimation:警告,已删除线程未提交的 CATransaction 创建者:
【发布时间】:2015-08-26 07:23:31
【问题描述】:

详情:

CoreAnimation:警告,删除了未提交 CATransaction 的线程;创建者:

0 QuartzCore 0x00007fff86c516c2 _ZN2CA11Transaction4pushEv + 312

1 QuartzCore 0x00007fff86c6c9a8 _ZN2CA11Transaction15ensure_implicitEv + 276

2 QuartzCore 0x00007fff86c57907 _ZN2CA5Layer13thread_flags_EPNS_11TransactionE + 37

3 QuartzCore 0x00007fff86c6f92d _ZN2CA5Layer13needs_displayEv + 45

4 QuartzCore 0x00007fff86c6f8f8 -[CALayer needsDisplay] + 21

5 AppKit 0x00007fff89a3df37 -[NSView viewWillDraw] + 1078

6 AppKit 0x00007fff89a3d2b0 -[NSView _sendViewWillDrawInRect:clipRootView:] + 1417

7 AppKit 0x00007fff899f6f1a -[NSView displayIfNeeded] + 1216

【问题讨论】:

    标签: multithreading macos cocoa warnings


    【解决方案1】:

    我刚刚在两种不同的情况下从控制台中发现了这个警告,并用相同的解决方案解决了这些问题。

    根本原因是我刚刚尝试在后台线程中更新 UI 元素,在我将更新任务分派到主线程后,问题解决了。

    在此处粘贴一个辅助函数,

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

    【讨论】:

    • 辅助函数代替单个dispatch_async(dispatch_get_main_queue(), …)有什么好处;
    • @AminNegm-Awad 视情况而定,如果块在主线程中执行,则不需要分派到主队列。
    • 没错,但是这个检查会产生额外的代码并且不是必须的。没有优势。除此之外,如果您在代码块中也有功能代码,您会惊讶地发现它有时同步执行,有时异步执行。
    猜你喜欢
    • 1970-01-01
    • 2023-03-02
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 2012-08-11
    • 2020-11-04
    相关资源
    最近更新 更多