Хранить результаты результатов из API с enum - PullRequest
0 голосов
/ 04 ноября 2019

Привет, я изучаю разработку для iOS из книги Big Nerd Ranch, я учусь обрабатывать данные из Интернета, следуя руководству по книге. теперь я хочу реализовать его в своем собственном приложении, но поскольку в книге показано только, как обрабатывать данные изображения. Я хочу обработать данные не только изображения, но и строковые данные, которые являются названием моей модели, я уже пытаюсь превратить перечисление в универсальный, чтобы он мог возвращать любой тип. это мой код

Это enum, прежде чем я перехожу в универсальный

enum ImagesResult {
    case success(UIImage)
    case failure(Error)
}

это enum после того, как я перехожу в универсальный

enum Results<Value> {
    case success(Value)
    case failure(Error)
}

это функция fetchImageData

    func fetchDataResult(for video: Video, completion: @escaping (Results<Any>) -> ()) {
        guard let videoKey = video.videoID else {
            preconditionFailure("Video expected to have a video id")
        }

        if let image = imageStore.image(forKey: videoKey) {
            OperationQueue.main.addOperation {
                completion(.success(image))
            }
            return
        }

        guard let videoURL = video.url else {
            preconditionFailure("Video expected to have video url")
        }

        let request = URLRequest(url: videoURL)

        let task = sessions.dataTask(with: request) { (data, response, error) in
            let result = self.processImageRequest(data: data, error: error)

            if case let .success(image) = result {
                self.imageStore.setImage(image, forKey: videoKey)
            }

            OperationQueue.main.addOperation {
                completion(result)
            }
        }
        task.resume()
    }

    private func processDataRequest(data: Data?, error: Error?) -> Results<Any> {

        guard
            let imageData = data,
            let image = UIImage(data: imageData) else {
                if data == nil {
                    return .failure(error!)
                } else {
                    return .failure(ThumbnailError.thumbnailCreationError)
                }
            }
        return .success(image)
    }

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

1 Ответ

1 голос
/ 04 ноября 2019

enum Результат уже существует, «Значение, которое представляет либо успех, либо сбой, включая соответствующее значение в каждом случае». Вы можете создать свой собственный enum ошибки, чтобы соответствовать всем вашим ошибкам, как это:

enum MyErrorEnum: Error {
    case myerror1
    case myerror2(String)

    var errorDescription: String {
        switch self {
        case .myerror1:
            return "Error: Error 1 description."
        case .myerror2(let error):
            return error
        }
    }
}

И результат в вашем обработчике завершения будет:

completion: @escaping (Result<(UIImage, String), MyErrorEnum>) 

Для того, чтобы вы могли вернутьсяизображение и заголовок

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...