Как обрабатывать данные из нескольких результатов с помощью enum - PullRequest
0 голосов
/ 10 ноября 2019

Я хочу получить UIImage и заголовок из моего объекта, поэтому я делаю общий результат с enum.

, но у меня возникает ошибка, когда я пытаюсь принять мой результат в завершение, и ошибка, когда я вызываю мой func fetchDataResult (для видео: видео, завершение: @escaping (Results <(UIImage ?, String?)>) -> ()) в моем контроллере. Это мой код.

Элемент «success» в «Results <(UIImage ?, String?)>» Создает результат типа «Results», но контекст ожидает «Results <(UIImage ?, String»?)> '

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

class VideoStore {
    func fetchDataResult(for video: Video, completion: @escaping (Results<(UIImage?, String?)>) -> ()) {
        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, nil)))
            }
            return
        }

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

        if let videoTitle = video.title {
            OperationQueue.main.addOperation {
                completion(.success((nil, videoTitle)))
            }
        }

        let request = URLRequest(url: videoURL)

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

            let result = self.processDataRequest(data: data, error: error)

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

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

    private func processDataRequest(data: Data?, error: Error?) -> Results<UIImage> {
        guard
            let imageData = data,
            let image = UIImage(data: imageData) else {
                if data == nil {
                    return .failure(error!)
                } else {
                    return .failure(ThumbnailError.thumbnailCreationError)
                }
            }
        return .success(image)
    }
}

Это мой VideoController с ошибкой

Невозможно присвоить значение типа' (UIImage ?, String?) 'Для типа'UIImage?

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        let video = videoDataSource.videos[indexPath.row]

        videoStore.fetchDataResult(for: video) { (results) in
            guard
                let videoIndex = self.videoDataSource.videos.firstIndex(of: video),
                case let .success(image) = results else { return }

            let photoIndexPath = IndexPath(item: videoIndex, section: 0)

            if let cell = tableView.cellForRow(at: photoIndexPath) as? VideoCell {
                cell.videoImgView.image = image
            }
        }
    }

1 Ответ

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

results в следующей строке:

videoStore.fetchDataResult(for: video) { (results) in

имеет тип (UIImage?, String?). Обработчик завершения для вашего fetchDataResult получает тип Results<(UIImage?, String?)>, как вы определили, что делает case success(Value) до case success((UIImage?, String?)).

Если вам нужно только UIImage? из значения, вам нужно сделать

guard
  let videoIndex = self.videoDataSource.videos.firstIndex(of: video),
  case let .success(image, _) = results else { return }

Обратите внимание, что Swift имеет собственный тип Results со времени Swift 5.

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