如何正确检查应用程序连接? [英] How do I check app connectivity correctly?

查看:44
本文介绍了如何正确检查应用程序连接?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个函数来在应用加载时检查连接.如果检测到 Internet 连接,应用程序应下载 JSON 数据并将数组保存在 UserDefaults 中,然后继续执行 UITableView 方法.但是,如果未找到互联网连接,应用程序应恢复 USerDefault 上的数组以填充另一个数组,然后继续执行 UItableView 方法.

I'm trying to create a function to check the Connectivity when the App loads. If a internet connection is detected, the app should download the JSON data and save the array in UserDefaults, then proceed to the UITableView methods. However, if the internet connection is not found, the app should recover the array on USerDefault to populate another array, then proceed to UItableView methods.

我面临的问题是,当编译器通过 UserDefault 行来保存数组时,应用程序立即崩溃.我做错了什么?

The problem I'm facing, is that when the compiler goes trough UserDefault line to be able to save the array, the app crashes immediately. What I'm doing wrong?

编译器错误:

) 用于密钥备份已保存'*** 第一次抛出调用堆栈:(0x18257ad8c 0x1817345ec 0x18257ac6c 0x1825b1d08 0x1824e730c 0x1824e5a60 0x1825b2080 0x182515ce0x1825b2080 0x1825b2304 0x182518d6c 0x182518588 0x182518c540x1825bc218 0x1825bf8a0 0x182edaaf4 0x102a794c0 0x102a7452c0x102e8d314 0x102e45b7c 0x103da11dc 0x103da119c 0x103da5d2c0x182523070 0x182520bc8 0x182440da8 0x184425020 0x18c45d7580x102a756b0 0x181ed1fc0) libc++abi.dylib:以未捕获终止NSException 类型的异常 (lldb)

) for key backupSaved' *** First throw call stack: (0x18257ad8c 0x1817345ec 0x18257ac6c 0x1825b1d08 0x1824e730c 0x1824e5a60 0x1825b2080 0x182515cec 0x1825b2080 0x1825b2304 0x182518d6c 0x182518588 0x182518c54 0x1825bc218 0x1825bf8a0 0x182edaaf4 0x102a794c0 0x102a7452c 0x102e8d314 0x102e45b7c 0x103da11dc 0x103da119c 0x103da5d2c 0x182523070 0x182520bc8 0x182440da8 0x184425020 0x18c45d758 0x102a756b0 0x181ed1fc0) libc++abi.dylib: terminating with uncaught exception of type NSException (lldb)

[FIXED]ViewController:

import UIKit
import Kingfisher
import Alamofire

var arrCerveja = [Cerveja]()
var arrBackup = [Cerveja]()

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!

    //TableView DataSource

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if Connectivity.isConnectedToInternet {
            return arrCerveja.count
        } else {
            return arrBackup.count
        }

    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cellID") as! TableViewCell


        if Connectivity.isConnectedToInternet {
            let model = arrCerveja[indexPath.row]

            cell.labelName.text = model.name
            cell.labelDetail.text = "Teor alcoólico: \(model.abv)"
            let resource = ImageResource(downloadURL: URL(string: "\(model.image_url)")!, cacheKey: model.image_url)

            cell.imageViewCell.kf.setImage(with: resource, placeholder: UIImage(named: "icons8-hourglass-48"), options: nil, progressBlock: nil, completionHandler: nil)


            return cell

        } else {
            let model = arrBackup[indexPath.row]

            cell.labelName.text = model.name
            cell.labelDetail.text = "Teor alcoólico: \(model.abv)"
            let resource = ImageResource(downloadURL: URL(string: "\(model.image_url)")!, cacheKey: model.image_url)

            cell.imageViewCell.kf.setImage(with: resource, placeholder: UIImage(named: "icons8-hourglass-48"), options: nil, progressBlock: nil, completionHandler: nil)


            return cell

        }



    }
    //TableView Delegate
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if Connectivity.isConnectedToInternet {
            performSegue(withIdentifier: "segueId", sender:arrCerveja[indexPath.row])
        } else {
            performSegue(withIdentifier: "segueId", sender:arrBackup[indexPath.row])
        }


    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if segue.identifier == "segueId" {

            let des = segue.destination as? TableViewDetalhes

            //.item possui uma propriedade instanciada na TelaDetalheProdutos
            des?.item = (sender as? Cerveja)
            //Segue para CollectionView Categorias
        }
    }

    struct Connectivity {
        static let sharedInstance = NetworkReachabilityManager()!
        static var isConnectedToInternet:Bool {
            return self.sharedInstance.isReachable
        }
    }

    override func viewDidAppear(_ animated: Bool) {
        if Connectivity.isConnectedToInternet {
            print("Connected")
            getApiData { (cerveja) in
                arrCerveja = cerveja
                //Backup
                do{
                    let data = try JSONEncoder().encode(arrCerveja)

                    UserDefaults.standard.set(data, forKey: "backupSaved")
                    //
                    self.tableView.reloadData()
                }catch{print(error)
                }
            }
        } else {
            print("No Internet")
            do{
                if let savedData = UserDefaults.standard.value(forKey: "backupSaved") as? Data {
                    arrBackup = try JSONDecoder().decode([Cerveja].self, from: savedData)
                    self.tableView.reloadData()
                }
            }catch{
                print(error)
            }
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        //SetupNavBarCustom
        navigationController?.navigationBar.setupNavigationBar()

   }


}

模型:

struct Cerveja:Decodable{
    let name:String
    let image_url:String
    let description:String
    let tagline:String
    let abv:Double
    let ibu:Double?
}

推荐答案

数组在保存之前应该被 endcoded 为 Data ,因为它是自定义对象的数组

The array should be endcoded to Data before saving , as it's array of custom objects

do {

       ....... write 

       let data = try JSONEncoder().encode(arr)

       UserDefaults.standard.set(data, forKey: "backupSaved")

       // save as data 

       ....... read

        if let  savedData = UserDefaults.standard.value(forKey: "backupSaved") as? Data {
          let savedArr = try JSONDecoder().decode([Cerveja].self, from: savedData)
          // use the array here 
        }

}
catch {
  print(error)
}

//

从现在起你编码 &解码

Since now you encode & decode

struct Cerveja:Codable {--}

//

我也不赞成在 userDefaults 中保存考虑 CoreData

Also I don't vote for saving in userDefaults consider CoreData

这篇关于如何正确检查应用程序连接?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆