问题描述
今天,当我试图推广我的'CoreData导入操作'时,遇到了一个奇怪的问题。
似乎如果我创建NSOperation的通用子类,则不会调用 main() func。
简单的例子:
class MyOperation< T:NSObject>:NSOperation {
override func main(){
println(My operation main was called)
}
}
如果你创建这个类的一个实例并将它添加到 operationQueue 中,你会发现它是 main()实际上没有被调用。
覆盖func viewDidLoad(){
super.viewDidLoad )
//加载视图后,通常从一个笔尖执行任何其他设置。
self.operationQueue = NSOperationQueue()
let operation = MyOperation< NSString>()
self.operationQueue!.addOperation(operation)
}
操作只需从准备好转换为执行和完成状态而不调用 main()。
如果我从 MyOperation 类中删除泛型注释< T:NSObject> 将工作正常。
这怎么可能?
我在这里丢失了什么?
问题是由以下简单规则引起的:
因此,当桥接到Objective-C时, MyOperation 看起来像纯的,没有重写方法, NSOperation 通过用 @标记覆盖func main(),你可以看到这个错误。 objc 属性。
@objc override func main(){//< [!]在一个泛型类中的方法不能用Objective-C
println(My operation main was called)来表示
}
Today I've met one weird issue when I was trying to 'generalize' my 'CoreData importing operations'.It appeared that if I create a generic subclass of NSOperation the main() func won't be called.
Simple example:
class MyOperation<T: NSObject>: NSOperation { override func main() { println("My operation main was called") } }
If you create an instance of this class and add it to the operationQueue you will see that it's main() isn't actually called.
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) }
Operation simply transits from ready to executing and to finished state without calling main().
If I remove generic annotation <T: NSObject> from MyOperation class it will work fine.
How is this possible?Am I missing something here?
The problem is caused by this simple rule:
As a result, when bridged to Objective-C, MyOperation looks like pure, with no methods are overridden, NSOperation subclass.
You can see this error by marking override func main() with @objc attribute.
@objc override func main() { // < [!] Method in a generic class cannot be represented in Objective-C println("My operation main was called") }
这篇关于通用NSOperation子类失去NSOperation功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!