Как работать с Core Data, сохраняя JSON-ответ, Показывать данные, когда интернет отключен в Swift 3? - PullRequest
0 голосов
/ 02 июня 2018

Я уже проанализировал 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()
                        }
                    }
                }
            }
        })
    }

}

1 Ответ

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

Для базовых данных вам необходимо создать необходимые объекты в модели CoreData .xcdatamodeld.
Нажмите на Добавить объект и назовите его.Затем добавьте атрибуты, которые вы хотите сохранить.

enter image description here

Вы можете увидеть эту ссылку о том, как создавать объекты и атрибуты.После создания всего, мы можем написать CoreDataStack и класс менеджера, или мы можем напрямую использовать код, предварительно написанный в AppDelegate, когда мы проверяем Core Data при создании проекта.Я буду здесь использовать класс 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 и ее атрибуты name и address

Вот класс 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
    }
}

Вы можете вызвать метод addRecord в своем классе ViewController, и он сохранит ваши данные.Я рекомендую вам передать весь массив, а затем добавить основные данные и, наконец, вызвать saveContext().

Наконец, вы можете использовать getRecords, чтобы получить все записи.

...