延迟加载屏幕对象

时间:2018-06-04 21:09:27

标签: ios uitableview

我不知道为什么,但是当我打开应用程序时,需要一段时间来加载屏幕上的所有数据,直到仍然没有内容的白色屏幕。加载的所有数据都是从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 :(得分:0)

除了它是一个繁重的网络加载VC,你目前没有任何问题加载数据,因为所有都是主线程,唯一的问题是加载图像,因为滚动它时再次下载图像,可能只是为了这个而下载我建议使用SDWebImage来处理下载和放大为您缓存,您的主要问题可能是许多请求的网络速度低

  • 管理此网络问题的另一件事是,您可以对数据下载进行串行排队,这将帮助您快速加载一个部分并显示它,这将给用户留下应用程序请求更多数据而非make的印象所有请求一次
相关问题