今天,当我试图“概括”我的“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)
}操作简单地从ready传输到executing和finished状态,而不调用main()。
如果我将泛型注释<T: NSObject>从MyOperation类中删除,它将正常工作。
这怎麽可能?我是不是漏掉了什么?
发布于 2014-09-29 16:50:09
这个问题是由这个简单的规则引起的:
方法在泛型类中不能在Objective中表示。
因此,当连接到Objective时,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")
}发布于 2015-02-11 10:24:28
解决办法:您可以创建NSOperation子类(没有泛型),覆盖main并调用您自己的'execute‘func,它可以被泛型子类覆盖。示例:
class SwiftOperation : NSOperation {
final override func main() {
execute()
}
func execute() {
}
}
class MyOperation<T> : SwiftOperation {
override func execute() {
println("My operation main was called")
}
}发布于 2015-10-16 21:38:51
在Xcode 7中,已经修复了通用NSOperation :如果我在操场上运行这段代码,它可以工作:
protocol SomeProtocol {
// markup protocol
}
class GenericOperation<SomeTypeImplementingProtocol: SomeProtocol>: NSOperation {
let referenceToSomeTypeImplementingProtocol: SomeTypeImplementingProtocol
init(referenceToSomeTypeImplementingProtocol: SomeTypeImplementingProtocol) {
self.referenceToSomeTypeImplementingProtocol = referenceToSomeTypeImplementingProtocol
}
override func main() {
debugPrint("The GenericOperation main() method was called.")
}
}
class TypeImplementingSomeProtocol: SomeProtocol {
init() {
}
}
let operationQueue = NSOperationQueue()
let typeImplementingSomeProtocolInstance = TypeImplementingSomeProtocol()
let operation = GenericOperation<TypeImplementingSomeProtocol>(referenceToSomeTypeImplementingProtocol: typeImplementingSomeProtocolInstance)
operationQueue.addOperation(operation)https://stackoverflow.com/questions/26097581
复制相似问题