Ошибка редактора IOS.archivedData переименован - PullRequest
0 голосов
/ 17 ноября 2018

Пожалуйста, помогите мне!Я застрял в петле и не могу найти выход.Я пытаюсь научиться программировать IOS для работы, поэтому я подумал, что начну с их учебного приложения - приложения со списком блюд.Я в той части, где вы должны начать сохранять постоянные данные, и теперь редактор застрял в бесконечном цикле.У меня есть строка кода ...

let isSuccessfulSave = NSKeyedArchiver.archiveRootObject(meals, toFile: Meal.ArchiveURL.path)

Это дает мне предупреждение, которое говорит ...

'archiveRootObject (_: toFile :)' устарел в iOS12.0: Использовать + archivedDataWithRootObject: requireSecureCoding: error: вместо

ОК, поэтому я изменяю строку кода на ...

let isSuccessfulSave = NSKeyedArchiver.archivedDataWithRootObject(meals)

, которая затем дает мне предупреждение ...

'archivedDataWithRootObject' был переименован в 'archivedData (withRootObject:)'

ОК, поэтому я изменил строку кода на ...

let isSuccessfulSave = NSKeyedArchiver.archivedData(withRootObject: meals)

Что говорит мне ...

'archivedData (withRootObject :)' устарел в iOS 12.0: использовать + archivedDataWithRootObject: требуетсяSecureCoding: ошибка: вместо

ОК ... Итак ... archivedData устарел, и я должен использовать archivedDataWithRootObject, но использование archivedDataWithRootObject было переименовано в archivedData, но archivedData устарело, поэтому используйте archivedDataWithRootObject, которое переименовано в archivedData, которое не рекомендуется ... до бесконечности.1028 *

Я попытался просмотреть документы для разработчиков, но они просто говорят мне то же самое, одно устарело, без ссылок или чего-то еще, и поиск в Google просто дает мне кучу страниц, показывающих мне синтаксис использования любого из них.Я все еще новичок в программировании на IOS и не знаю, как выйти из этого бесконечного цикла от устаревшего к переименованному к устаревшему к ...

Пожалуйста, помогите, я потерялся и не знаю, как продолжить.Спасибо.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Я следую тому же примеру, который вы пытаетесь сделать , и я выяснил, как обновить методы для хранения и получения значений в iOS 12, это должно помочь вам:

//MARK: Private Methods
private func saveMeals() {

    let fullPath = getDocumentsDirectory().appendingPathComponent("meals")

    do {
        let data = try NSKeyedArchiver.archivedData(withRootObject: meals, requiringSecureCoding: false)
        try data.write(to: fullPath)
        os_log("Meals successfully saved.", log: OSLog.default, type: .debug)
    } catch {
        os_log("Failed to save meals...", log: OSLog.default, type: .error)
    }
}

func getDocumentsDirectory() -> URL {
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    return paths[0]
}

private func loadMeals() -> [Meal]? {
    let fullPath = getDocumentsDirectory().appendingPathComponent("meals")
    if let nsData = NSData(contentsOf: fullPath) {
        do {

            let data = Data(referencing:nsData)

            if let loadedMeals = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? Array<Meal> {
                return loadedMeals
            }
        } catch {
            print("Couldn't read file.")
            return nil
        }
    }
    return nil
}

Также вы обнаружите, что вам нужно обновить ViewDidLoad следующим образом:

override func viewDidLoad() {
    super.viewDidLoad()

    // Use the edit button item provided by the table view controller.
    navigationItem.leftBarButtonItem = editButtonItem

    let savedMeals = loadMeals()

    if savedMeals?.count ?? 0 > 0 {
        meals = savedMeals ?? [Meal]()
    } else {
        loadSampleMeals()
    }

}

Надеюсь, это поможет, для меня приложение теперь работает, хранит и извлекает данные.

К вашему сведению: Это не работает с бета-версией Xcode 11, а iOS 13 должна работать с чем-либо до этих версий.

0 голосов
/ 17 ноября 2018

Вам нужно

try {
   let data = try NSKeyedArchiver.archivedData(withRootObject:meals,requiringSecureCoding:true)
   try data.write(to:fullPath)
}
catch {
   print(error)
}

Здесь, в Документы это IOS 11 +

...