Какао Свифт - Отмена задачи FileManager - PullRequest
0 голосов
/ 05 июля 2018

У меня есть функция FileManager. Он копирует файлы из A в B. Я хочу создать кнопку, чтобы отменить это действие. Итак, я написал это:

@IBAction func onClickCancelBtn(_ sender: NSButton) {
    print(oq.isSuspended)
    oq.cancelAllOperations()
}



//MARK: - Sync Button
var oq = OperationQueue()
@IBAction func onClickSyncBtn(_ sender: NSButton) {

    ProgressBar.doubleValue = 0

    ProgressInfo.isHidden = false

    CancelBtn.isHidden = false

    oq.addOperation {
        self.OneWayBackUp(thePlaylists: selected_playlists)
    }
}

Кажется, это не работает, как я ожидал. Я делаю это неправильно?

1 Ответ

0 голосов
/ 05 июля 2018

Отмена с операциями и очередями операций не происходит автоматически. Когда вы отменяете операцию, она просто устанавливает флаг, указывающий, что она была отменена. Пользовательский код операции должен проверить этот флаг и прекратить свою работу.

В общем случае нереально остановить поток (или остановить работу, выполняемую этим потоком) без взаимодействия кода, выполняющегося в этом потоке. Это оставило бы состояние программы в поврежденной конфигурации (например, мьютексы постоянно заблокированы).

К сожалению, FileManager не предоставляет способ отменить свои операции. Вам придется использовать API более низкого уровня, чтобы включить отмену. Функция copyfile(), вероятно, лучшая. Документы больше не находятся в сети, ни в документации XCode, но вы можете использовать команду man copyfile, чтобы увидеть их.

...