Поскольку я имею дело с вызовами веб-сервисов и извлечения базы данных, я наткнулся на проблему NSBlockOperation, которая не запускается.NSBlockOperation не выполняет
Но, чтобы объяснить вещи немного поначалу. Основная цель состоит в том, чтобы иметь очередь работы, которая состоит из следующих операций:
- Операция # 1 - отправить запрос на веб-службы, чтобы приступить к созданию базы данных .zip файл
- операции # 2 - после завершения # 1, повторно вызывайте веб-службу для процесса сжатия .zip-файла
- Операция №3 - после завершения # 2 загрузите базу данных с помощью NSURLSessionDownloadTask.
Чтобы сделать это, я определил следующий класс:
class DatabaseServerDownload {
typealias Callback = (storedLocation : NSURL) ->()
typealias Failure = ((error : NSError) -> Void)
let callback : Callback
let failure : Failure
let operationQueue : NSOperationQueue
required init(callback : Callback, failure : Failure) {
operationQueue = NSOperationQueue()
operationQueue.maxConcurrentOperationCount = 1
self.callback = callback
self.failure = failure
}
func start() {
let databaseCreationOperation = createDatabaseOnServer()
let databaseCheckOperation = repeatedlyCheckForDatabaseReadiness()
let databaseDownloadOperation = downloadDatabaseFromServer()
databaseCheckOperation.addDependency(databaseCreationOperation)
databaseDownloadOperation.addDependency(databaseCheckOperation)
operationQueue.addOperations([databaseCreationOperation, databaseCheckOperation, databaseDownloadOperation], waitUntilFinished: true)
}
func createDatabaseOnServer() -> BlockOperation {
let operation : BlockOperation = BlockOperation()
operation.addExecutionBlock({SVMRSendTask(method: BeginCreatingDatabase(), onSuccess: {operation.finish()}, onFailure: {e in}).apply()})
return operation
}
func repeatedlyCheckForDatabaseReadiness() -> NSBlockOperation {
return NSBlockOperation(block: {SVMRRequestTask(method: DatabaseZipReady()).apply(5, c: {s in s == "OK"}, f: {s in String(s)}, onSuccess: {r in}, onFailure: {e in})})
}
func downloadDatabaseFromServer() -> NSBlockOperation {
let sourceURL : NSURL = RequestDatabaseIdentitiesForDownload.sharedInstance.databaseURL
return NSBlockOperation(block: {DownloadTask(url: sourceURL, progressCallback: {p in}, successCallback: {l in}, failureCallback: {e in }).start()})
}
}
Если SVMRRequestTask принимает метод веб-сервиса в качестве аргумента (в то время как метод экземпляра абстрактного класса SVMR), после чего он выполняет запрос веб-службы, используя NSURLSessionTasks.
Хотя BlockOperation выглядит следующим образом:
class BlockOperation : NSBlockOperation {
private var _isFinished : Bool = false
private var _isExecuting : Bool = false
override var finished : Bool {
return _isFinished
}
override var executing : Bool {
return _isExecuting
}
func finish() {
if cancelled {
return
}
self.willChangeValueForKey("ready")
_isReady = false
self.didChangeValueForKey("ready")
self.willChangeValueForKey("executing")
_isExecuting = false
self.didChangeValueForKey("executing")
self.willChangeValueForKey("finished")
_isFinished = true
self.didChangeValueForKey("finished")
}
}
Может кто-нибудь объяснить, что именно я делаю неправильно - так как я использую класс NSOperation в первый раз. До этого я, конечно, пошел по всей документации Apple и некоторым другим ссылкам, но, к сожалению, ничего не мог найти.