Как бы я сразу проанализировал все данные из страничного API в Swift 4? - PullRequest
0 голосов
/ 04 января 2019

Я создаю приложение с табличным представлением и контроллером поиска, используя API Rick and Morty, https://rickandmortyapi.com/api/character/. API разбит на страницы, и я могу проанализировать данные с первой страницы и отобразить их на моемTableView.Я также могу получить другие страницы API, когда прокручиваю таблицу.Я не могу понять, как разобрать все данные со страниц одновременно.Когда я использую контроллер поиска, я не могу искать все символы, пока не прокручиваю tableView, чтобы получить все символы.Я хочу иметь возможность искать любой символ без предварительной прокрутки tableView.Как бы я сразу проанализировал все данные с разных страниц и отобразил их в виде таблицы?Любая помощь приветствуется, спасибо!

Это мой текущий код для анализа данных и получения других страниц при прокрутке tableView

func getIntitalRickAndMortyData(){
    downloadedDataArray = []
    //here first page is next page
    nextPageUrl = "https://rickandmortyapi.com/api/character/"
    getRickAndMortyData()
    filteredCharacterArray = downloadedDataArray
}

func getRickAndMortyData() {

    //construct the url, use guard to avoid nonoptional
    guard let urlObj = URL(string: nextPageUrl) else
    { return }

    //fetch data
    URLSession.shared.dataTask(with: urlObj) {[weak self](data, response, error) in

        //to avoid non optional in JSONDecoder
        guard let data = data else { return }

        do {
            //decode object
            let downloadedRickAndMorty = try JSONDecoder().decode(PagedCharacters.self, from: data)
            self?.downloadedDataArray.append(contentsOf: downloadedRickAndMorty.results)
            self?.nextPageUrl = downloadedRickAndMorty.info.next
            self?.filteredCharacterArray = (self?.downloadedDataArray)!
            self?.currentPage += 1

            DispatchQueue.main.async {
                self?.tableView.reloadData()
            }
            //print(self?.aryDownloadedData as Any)

        } catch {
            print(error)

        }

        }.resume()

}
  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


    let count = self.downloadedDataArray.count
        if count > 1 {
        let lastElement = count - 1
        if indexPath.row == lastElement {
            //call get api for next page
            getRickAndMortyData()
        }
    }

    guard let cell = tableView.dequeueReusableCell(withIdentifier: "rickandmortyCell") as? CharacterTableViewCell else { return UITableViewCell() }

    let results: Results
    if isFiltering() {
        results = filteredCharacterArray[indexPath.row]
    } else {
        results = downloadedDataArray[indexPath.row]
    }


    cell.selectionStyle = .none

    cell.nameLabel.text = results.name
    cell.statusLabel.text = results.status
    cell.genderLabel.text = results.gender
    cell.originLabel.text = results.origin.name
    cell.lastlocationLabel.text = results.location.name

    let id = String(results.id)
    cell.idLabel.text = id



    return cell
}

}

IЯ пытался сделать это, используя цикл while, сохраняя текущий счетчик страниц и увеличивая его, но ничего не отображается, и я получаю это в консоли: «Соединение XPC прервано»

 func getAllRickAndMortyData() {
    while currentPage <= 25 {
        getRickAndMortyData()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...