代码之家  ›  专栏  ›  技术社区  ›  rckoenes

Swift 6与`NSTextAttachmentViewProvider的并发问题`

  •  1
  • rckoenes  · 技术社区  · 1 年前

    我完全坚持使用子类 NSTextAttachmentViewProvider swift 6并发。

    所以,假设我有一个简单的习惯 NSTextAttachmentViewProvider :

    final shapeViewProvider: NSTextAttachmentViewProvider {
    
       override func loadView() {
          let view = UIView()
          view.background = .red
    
          self.view = view
       }
    
    }
    

    编译时不会出现以下错误:

    Call to main actor-isolated initializer 'init()' in a synchronous nonisolated context

    为类或方法添加注释 @MainActor 将不起作用:

    Main actor-isolated instance method 'loadView()' has different actor isolation from nonisolated overridden declaration

    1 回复  |  直到 1 年前
        1
  •  1
  •   Sweeper    1 年前

    不幸的是,这只是Swift的一个局限性。这个问题正在讨论中 this Swift Forums thread .

    现在,你可以通过包裹来解决这个问题 MainActor.assumeIsolated 围绕主要参与者需要的代码。

    class SomeProvider: NSTextAttachmentViewProvider {
        override func loadView() {
            self.view = MainActor.assumeIsolated {
                let view = UIView()
                view.backgroundColor = .red
                return view
            }
        }
    }
    

    如果发生以下情况,它将崩溃 loadView 没有请主要演员。如果你正确使用TextKit,这个假设应该是正确的。