【问题标题】:How to work with Core Data saving JSON response,Show data when internet is offline in Swift 3?如何使用 Core Data 保存 JSON 响应,在 Swift 3 中离线时显示数据?
【发布时间】:2018-06-02 06:06:01
【问题描述】:

我已经解析了JSON 并显示在tableView 中,它工作正常。现在我的问题是我将如何离线保存数据并使用Core Data 显示何时无法离线使用互联网。我在 Swift 3 中工作。如果有人可以帮助我截屏,那将是很大的帮助。 下面是我获取 json 并显示在 tableView 上的代码:

import UIKit
import SystemConfiguration

struct CellData {

    var name:String
    var address:String

    public init(name:String,address:String){

        self.name = name
        self.address = address
    }
}

///ViewController
class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate {
    @IBOutlet weak var tableViewData: UITableView!

    var arrayData = [CellData]()

    override func viewDidLoad() {
        super.viewDidLoad()

        if Reachability.isConnectedToNetwork(){
            print("Internet Connection Available!")
            fetchServerData()


        }else{

            let alert = UIAlertController(title: "No Internet connection", message: "Please ensure you are connected to the Internet", preferredStyle: UIAlertControllerStyle.alert)

            alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
            self.present(alert, animated: true, completion: nil)
            print("Internet Connection not Available!")
        }
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return arrayData.count
    }

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

        cell.lblTop.text = "????\(arrayData[indexPath.row].name)"
        cell.lblBottom.text = arrayData[indexPath.row].address

        return cell
    }


    func fetchServerData(){

        let prs = [
            "author_id": "1780",
            "get_deals_author": "1" as String
        ]
        Service.StartWithoutLoading(prs as [String : AnyObject]?, onCompletion: { result in

            let json = result as? NSDictionary
            if let data = json as? [String:Any]{
                if let err = data["status"] as? String, err == "success"{
                    if let data = data["result"] as? [Any]{

                        var arrayData = [CellData]()

                        for sectionObj in data{
                            if let sectionObjVal = sectionObj as? [String:Any]{

                                if let name_deal = sectionObjVal["name"] as? String{
                                    if let address_deal = sectionObjVal["address"] as? String{

                                        let dataValue = CellData.init(name: name_deal, address: address_deal)

                                        arrayData.append(dataValue)
                                    }
                                }
                            }
                        }
                        DispatchQueue.main.async { () -> Void in

                            self.arrayData.removeAll()
                            self.arrayData = arrayData
                            self.tableViewData.reloadData()
                        }
                    }
                }
            }
        })
    }

}

【问题讨论】:

    标签: json swift uitableview core-data swift3


    【解决方案1】:

    对于Core Data,您需要在CoreData 模型.xcdatamodeld 中创建您需要的实体。
    点击添加实体并命名您的实体。然后添加您需要保存的属性。

    您可以查看link 了解如何创建实体和属性。创建完所有内容后,我们可以编写一个CoreDataStack 和一个管理器类,或者我们可以在创建项目时检查Core Data 时直接使用AppDelegate 中预先编写的代码。我将在这里使用CoreDataStack 类。

    这是课程

    import Foundation
    import CoreData
    
    class CoreDataStack: NSObject {
    
        static let moduleName = "YourProject"
        static let shared = CoreDataStack()
    
        private override init() {
            super.init()
            _ = self.persistentContainer
        }
    
        func saveContext () {
                let context = persistentContainer.viewContext
                if context.hasChanges {
                    do {
                        try context.save()
                    } catch {
    
                        let nserror = error as NSError
                        fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
                    }
                }
            }
    
        lazy var persistentContainer: NSPersistentContainer = {
    
            let container = NSPersistentContainer(name: CoreDataStack.moduleName)
            container.loadPersistentStores(completionHandler: { (storeDescription, error) in
                if let error = error as NSError? {
                    fatalError("Unresolved error \(error), \(error.userInfo)")
                }
                print("Coordinator URL - \(storeDescription)")
            })
            return container
        }()
    }
    

    现在我们可以创建一个管理器类来插入数据。假设您的实体是 Person,其属性是 nameaddress

    这是用于插入、更新、获取数据的 CoreDataManager 类。

    import UIKit
    import CoreData
    
    class CoreDataManager: NSObject {
    
        class func addRecord(object:[String:Any]) {
            let person = NSEntityDescription.insertNewObject(forEntityName: "Person", into: CoreDataStack.shared.persistentContainer.viewContext) as! Person
            person.name = object["name"] as? String
            person.address = object["address"] as? String
            CoreDataStack.shared.saveContext()
        }
    
       class func getRecords() -> [Person]? {
            let request:NSFetchRequest<Person> = Person.fetchRequest()
            do {
                let results = try CoreDataStack.shared.persistentContainer.viewContext.fetch(request)
                return results
            } catch {
                print(error.localizedDescription)
            }
           return nil
        }
    }
    

    您可以在ViewController 类中调用addRecord 方法,它会保存您的数据。我建议你传递完整的数组,然后添加核心数据,最后调用saveContext()

    最后你可以使用getRecords 来获取所有记录。

    【讨论】:

    • 仍然无法理解我使用“名称”和“地址”创建的实体
    • 您不必创建单独的实体。名称为 Person 且其属性为名称和地址的单个实体。首先查看核心数据教程以了解核心数据的工作原理
    • 将它们插入核心数据。还有什么?
    猜你喜欢
    • 1970-01-01
    • 2017-06-26
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-29
    相关资源
    最近更新 更多