Должна ли обработка происходить «за» предупреждением? - PullRequest
0 голосов
/ 26 февраля 2019

Я пишу процедуру, чтобы проверить, существует ли файл, и если да, предупредить пользователя и спросить, нужно ли мне перезаписать.Я получаю то, что для меня странное поведение.

Вот мой код для записи файла.

    if let jsonToSave = myFile.json {
            var shouldIOverwrite: Bool = false
          if let url = try? FileManager.default.url(
                for: .documentDirectory,
                in: .userDomainMask,
                appropriateFor: nil,
                create: true
                ).appendingPathComponent(name + ".json"){
                do {
                    print("place 1: \(shouldIOverwrite)")
                     shouldIOverwrite = presentOverwriteWarning(for: url, fName: name)
                    print("place 2: \(shouldIOverwrite)")
                    if shouldIOverwrite {   
                        try jsonToSave.write(to: url)
                        print("saved successfully")
                    }
                } catch let error {
                    print("couldn't save \(error)")
                }
            }
        }

Вот функция, которая устанавливает и представляет предупреждение:

private func presentOverwriteWarning(for url: URL?, fName: String) -> Bool {
    var overwrite: Bool = false

        let alert = UIAlertController(
            title: "File for \"" + fName + "\" exists",
            message: "Do you want to overwrite it?",
            preferredStyle: .alert
        )
        alert.addAction(UIAlertAction(
            title: "Yes",
            style: .default,
            handler: { action in
                 overwrite = true
        }
        ))
        alert.addAction(UIAlertAction(
            title: "No",
            style: .default,
            handler: { action in
                overwrite = false
        }
        ))
        present(alert, animated: true)

    return overwrite
}

Я возвращаю перезаписать значение Bool.Обратите внимание, у меня есть две команды печати «место 1» и «место 2».Когда я отлаживаю, я вижу, что 2 отпечатка уже перечислены в выводе как ложные, прежде чем мое предупреждение появится на моем экране, прежде чем оно ответит.Так что мое «если перезаписать» всегда ложно.Я что-то упустил в своем предупреждении?

Примечание: вы увидите, что нет кода, чтобы проверить, существует ли файл еще.Для отладки я всегда вызываю оповещение.

1 Ответ

0 голосов
/ 27 февраля 2019

Я бы изменил вашу функцию presentOverwriteWarning на использование обратного вызова вместо того, чтобы он возвращал что-либо, поскольку предупреждение является асинхронным:

private func presentOverwriteWarning(for url: URL?, fName: String, callback: (Bool) -> Void) {
    let alert = UIAlertController(
        title: "File for \"" + fName + "\" exists",
        message: "Do you want to overwrite it?",
        preferredStyle: .alert
    )
    alert.addAction(UIAlertAction(
        title: "Yes",
        style: .default,
        handler: { action in
            callback(true)
    }
    ))
    alert.addAction(UIAlertAction(
        title: "No",
        style: .default,
        handler: { action in
            callback(false)
    }
    ))
    present(alert, animated: true)
}

Затем вы можете использовать его следующим образом:

presentOverwriteWarning(for: url, fName: name) { overwrite in
    if (overwrite) {
         try jsonToSave.write(to: url)
    }
}

ОБНОВЛЕНИЕ: Чтобы исправить ошибку компиляции, связанную с попыткой jsonToSave, вам нужно переместить блок do-catch:

presentOverwriteWarning(for: url, fName: name) { overwrite in
    if (overwrite) {
         do {
            try jsonToSave.write(to: url)
         } catch {

         }
    }
}
...