2016-02-07 2 views
1

Поскольку я имею дело с вызовами веб-сервисов и извлечения базы данных, я наткнулся на проблему NSBlockOperation, которая не запускается.NSBlockOperation не выполняет

Но, чтобы объяснить вещи немного поначалу. Основная цель состоит в том, чтобы иметь очередь работы, которая состоит из следующих операций:

  1. Операция # 1 - отправить запрос на веб-службы, чтобы приступить к созданию базы данных .zip файл
  2. операции # 2 - после завершения # 1, повторно вызывайте веб-службу для процесса сжатия .zip-файла
  3. Операция №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 и некоторым другим ссылкам, но, к сожалению, ничего не мог найти.

ответ