Задержка загрузки экранных объектов - PullRequest
0 голосов
/ 05 июня 2018

Не знаю почему, но когда я открываю приложение, загрузка всех данных на экране занимает некоторое время, пока не останется белый экран без содержимого.Все загруженные данные загружаются из API.Что я должен сделать, чтобы сделать его лучше?

App Unloaded

Приложение загружается примерно через 10 секунд:

enter image description here

Я опубликую ниже, как я анализирую все данные. ViewController.swift:

    import UIKit

    class ViewController: UIViewController, UICollectionViewDataSource, UITableViewDataSource {

        @IBOutlet weak var tableViewTopSell: UITableView!
        @IBOutlet var collectionView: UICollectionView!
        @IBOutlet weak var collectionViewBanner: UICollectionView!


        var dataSource: [Content] = [Content]()
        var dataBanner: [Banner] = [Banner]()
        var dataTopSold: [Top10] = [Top10]()

        override func viewDidLoad() {
            super.viewDidLoad()
            //SetupNavBarCustom
            self.navigationController?.navigationBar.CustomNavigationBar()
            let logo = UIImage(named: "tag.png")
            let imageView = UIImageView(image:logo)
            self.navigationItem.titleView = imageView
            //CallAPIData
            getTopSold { (data) in
                DispatchQueue.main.async {
                    self.dataTopSold = data
                    self.tableViewTopSell.reloadData()
                }
            }
            getBanner { (data) in
                DispatchQueue.main.async {
                self.dataBanner = data
                self.collectionViewBanner.reloadData()
                }
            }
            getAudiobooksAPI { (data) in
                DispatchQueue.main.async {
                    self.dataSource = data
                    self.collectionView.reloadData()
                }
            }
        }
        //CollectionView
        func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            if (collectionView == self.collectionView) {
                return  self.dataSource.count
            }else{
                return self.dataBanner.count
            }}
        func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

            if (collectionView == self.collectionView) {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionViewCell", for: indexPath) as! CollectionViewCell

            let content = self.dataSource[indexPath.item]

            cell.bookLabel.text = content.descricao
            cell.bookImage.setImage(url: content.urlImagem, placeholder: "")

            return cell

            }else if (collectionView == self.collectionViewBanner) {

                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionViewCellBanner", for: indexPath) as! CollectionViewCell

                let content = self.dataBanner[indexPath.item]

                cell.bannerImage.setImage(url: content.urlImagem, placeholder: "")


                return cell
            }
            return UICollectionViewCell()
        }
    //TableView
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.dataTopSold.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "topSoldCell", for: indexPath) as! TableViewCell

        let content = self.dataTopSold[indexPath.item]

        cell.labelNomeTopSell.text = content.nome
        cell.imageViewTopSell.setImage(url: content.urlImagem, placeholder: "")

        return cell
}
}

extension UIImageView{
    func setImage(url : String, placeholder: String, callback : (() -> Void)? = nil){
        self.image = UIImage(named: "no-photo")

        URLSession.shared.dataTask(with: NSURL(string: url)! as URL, completionHandler: { (data, response, error) -> Void in

            guard error == nil else{
                return
            }
            DispatchQueue.main.async(execute: { () -> Void in
                let image = UIImage(data: data!)
                self.image = image

                if let callback = callback{
                    callback()
                }


            })

        }).resume()
    }
}

DataStore.swift:

import Foundation
import UIKit



    func getBanner(_ completion:@escaping ([Banner])->Void) {

        let url = URL(string: "https://alodjinha.herokuapp.com/banner")

        let session = URLSession.shared

        guard let unwrappedURL = url else { print("Error unwrapping URL"); return }

        let dataTask = session.dataTask(with: unwrappedURL) { (data, response, error) in

            guard let unwrappedDAta = data else { print("Error unwrapping data"); return }

            do {
                let jsonBanner = try JSONDecoder().decode(BannerData.self, from: unwrappedDAta)

                completion(jsonBanner.data)

            } catch {
                print("Could not get API data. \(error), \(error.localizedDescription)")
            }
        }
        dataTask.resume()
        }


   func getTopSold(_completion:@escaping ([Top10])->Void) {

    let url = URL(string: "https://alodjinha.herokuapp.com/produto/maisvendidos")

    let session = URLSession.shared

    guard let unwrappedURL = url else { print("Error url"); return}

    let dataTask = session.dataTask(with: unwrappedURL) { (data, response, error) in

        guard let unwrappedData = data else { print("Error data"); return}

        do {

            let jsonTop10 = try JSONDecoder().decode(Top10Data.self, from: unwrappedData)

            _completion(jsonTop10.data)



        }catch{
            print("Could no get API data")
        }
    }
    dataTask.resume()

    }

Model.swift:

import Foundation

//Categorias
struct Contents : Decodable {
    let data : [Content]
}
struct Content : Decodable {
    let id : Int
    let descricao : String
    let urlImagem : String
}
//Banner
struct BannerData : Decodable {
    let data : [Banner]
}
struct Banner : Decodable {
    let id : Int
    let urlImagem : String
    let linkUrl : String
}
//Top10
struct Top10Data:Decodable {
    let data: [Top10]
}
struct Top10:Decodable {
    let id : Int
    let nome : String
    let urlImagem : String
}

1 Ответ

0 голосов
/ 05 июня 2018

Помимо того, что VC загружается из сети, у вас в настоящее время нет проблем с загрузкой данных, так как все они находятся вне основного потока, единственная проблема - это загрузка изображений, так как при прокрутке они снова загружают изображение, котороеможет быть только что загружен для этого, я рекомендую использовать SDWebImage , который позаботится о загрузке и кеше для вас, вашей главной проблемой может быть низкая скорость сети для многих запросов

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