неперехваченное исключение при записи в статический словарь в HTTP-запросе

#swift #dictionary

#swift #словарь

Вопрос:

Я получаю неперехваченное исключение в рамках http-закрытия, связанного со словарем, в котором указано, что существует неперехваченное исключение. Когда я устанавливаю исключения точки останова, это указывает на словарь. Рассматриваемый словарь объявлен в структуре как статический var и в нем уже есть несколько значений, так как же это может происходить? Вот http-запрос.

  session.dataTask(with: request){ (data, response, error) in
            if let data = data,
                let tile = UIImage(data: data),
                let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first{
                let fileName = Date().timeIntervalSince1970
                let filePath = documentsURL.appendingPathComponent(String(describing: fileName))


                Maps.tileCachePath[url] = fileName  //<- this is where the exception happens


                //make sure there is no old file and if so delete it
                if FileManager.default.fileExists(atPath: filePath.path){
                    do {
                        try FileManager.default.removeItem(at: filePath)

                    } catch{
                        print("error deleting old tile")
                    }

                }

                //now write the new file
                FileManager.default.createFile(atPath: filePath.path, contents: data, attributes: nil)
                print(filePath.path)
                //return
                result(tile, error)

            } else {
                result(nil, error)
            }


            }.resume()
  

Ответ №1:

Это опечатка

Заменить

 Maps.tileCachePath[url] = fileName
  

с

 Maps.tileCachePath[url] = filePath
  

В принципе Date().timeIntervalSince1970 в качестве имени файла — это очень плохая идея. Число содержит доли секунды, которые обрабатываются как расширение файла.

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

Комментарии:

1. После попытки обоих решений (преобразования double в строку и замены double фактическим именем файла) я все еще получаю сбой. если я отключаю точку останова для неперехваченных исключений, иногда это EXC_BAD_ACCESS, иногда это исключение.

2. не уверен, помогает ли это, но исключением является ‘NSInvalidArgumentException’, причина: ‘-[__NSCFNumber count]: нераспознанный селектор, отправленный экземпляру

Ответ №2:

Date().timeIntervalSince1970 является двойным, вам может понадобиться строковое значение там.