一尘不染

通用NSOperation子类失去了NSOperation功能

swift

今天,当我试图“通用化”我的“
CoreData导入操作”时遇到了一个奇怪的问题。看来,如果我创建NSOperation的通用子类,main()则不会调用该func。

简单的例子:

class MyOperation<T: NSObject>: NSOperation {

    override func main() {
        println("My operation main was called")
    }
}

如果您创建此类的实例并将其添加到中,operationQueue您将看到main()实际上并没有调用它。

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    self.operationQueue = NSOperationQueue()
    let operation = MyOperation<NSString>()
    self.operationQueue!.addOperation(operation)
}

操作简单地从过境readyexecutingfinished状态,而无需调用main()

如果我<T: NSObject>MyOperation类中删除通用注释,它将正常工作。

这怎么可能?我在这里想念什么吗?


阅读 191

收藏
2020-07-07

共1个答案

一尘不染

问题是由以下简单规则引起的:

通用类中的方法无法在Objective-C中表示

结果,当桥接到Objective-C时,它MyOperation看起来像是纯的,没有方法被覆盖,是NSOperation子类。

您可以通过标记看到这个错误override func main()@objc属性。

@objc override func main() {  // < [!] Method in a generic class cannot be represented in Objective-C
    println("My operation main was called")
}
2020-07-07