【发布时间】:2014-06-08 18:57:13
【问题描述】:
我在 Swift 中继承 NSOperation 并且需要覆盖 isExecuting 和 isFinished 属性,因为我覆盖了 start 方法。
我遇到的问题是如何在保留键值观察 (KVO) 的同时还能够覆盖这些属性。
通常在 Obj-C 中,在类扩展 JSONOperation () 定义中将属性重新声明为 readwrite 是相当容易的。但是,我在 Swift 中没有看到同样的功能。
例子:
class JSONOperation : NSOperation, NSURLConnectionDelegate
{
var executing : Bool
{
get { return super.executing }
set { super.executing } // ERROR: readonly in the superclass
}
// Starts the asynchronous NSURLConnection on the main thread
override func start()
{
self.willChangeValueForKey("isExecuting")
self.executing = true
self.didChangeValueForKey("isExecuting")
NSOperationQueue.mainQueue().addOperationWithBlock(
{
self.connection = NSURLConnection(request: self.request, delegate: self, startImmediately: true)
})
}
}
所以这是我想出的解决方案,但感觉非常丑陋和hacky:
var state = Operation()
struct Operation
{
var executing = false
var finished = false
}
override var executing : Bool
{
get { return state.executing }
set { state.executing = newValue }
}
override var finished : Bool
{
get { return state.finished }
set { state.finished = newValue }
}
请告诉我有更好的方法。我知道我可以创建一个var isExecuting 而不是整个struct,但是我有两个名称相似的属性,这会引入歧义并使其可公开写入(我不想要)。
哦,我会为一些访问修饰符关键字做什么...
【问题讨论】:
-
顺便说一句,
start函数也应该检查if (cancelled) {...},如果是,则立即finish操作并退出。
标签: ios macos swift nsoperation