【发布时间】:2017-01-14 13:35:18
【问题描述】:
我有一个这样定义的 AsyncOperation 类
import Foundation
class ASyncOperation: NSOperation {
enum State: String {
case Ready, Executing, Finished
private var keyPath: String {
return "is" + rawValue
}
}
var state = State.Ready {
willSet {
willChangeValueForKey(newValue.keyPath)
willChangeValueForKey(state.keyPath)
}
didSet {
didChangeValueForKey(oldValue.keyPath)
didChangeValueForKey(state.keyPath)
}
}
override var ready: Bool {
return super.ready && state == .Ready
}
override var executing: Bool {
return super.ready && state == .Executing
}
override var finished: Bool {
return super.ready && state == .Finished
}
override var asynchronous: Bool {
return true
}
override func start() {
if cancelled {
state = .Finished
return
}
main()
state = .Executing
}
override func cancel() {
state = .Finished
}
}
及其子类 ImageLoadOperation。
import Foundation
import UIKit
import Firebase
class ImageLoadOperation: ASyncOperation {
var imagePath: String?
var image: UIImage?
override func main(){
let storage = FIRStorage.storage()
let storageRef = storage.referenceForURL("gs://salisbury-zoo- 91751.appspot.com")
if let path = imagePath {
let imageReference = storageRef.child(path)
imageReference.dataWithMaxSize(3 * 1024 * 1024) { (data, error) -> Void in
if (error != nil) {
self.image = nil
} else {
self.image = UIImage(data: data!)
self.state = .Finished
}
}
}
}
}
所以我去调用队列中的操作
let queue = NSOperationQueue()
let imageLoad = ImageLoadOperation()
queue.addOperation(imageLoad)
let img:UIImage? = imageLoad.image
但它总是返回 nil。当我在 ImageLoadOperation 的回调中放置一个打印语句时,图像就在那里并且状态设置为完成。当我添加
queue.waitUntilAllOperationsAreFinished()
在 queue.addOperation 和 let img:UIImage 之间? = imageLoad.load 然后整个应用程序停止,因为主线程被阻塞。关于如何让图像出现在回调范围之外的任何其他想法?我也试过在没有 NSOperationQueue 的情况下这样做,就像没有运气的 NSOperation 一样。
【问题讨论】:
标签: swift asynchronous firebase nsoperationqueue firebase-storage