Как показать данные Json в автономном режиме с использованием основных данных - PullRequest
0 голосов
/ 23 мая 2018

Здесь я создал табличное представление с labelName и labelUsername, и я скачал данные Json и сохранил их в основном объекте данных с именем Details, который содержит атрибуты name и username .. здесь табличное представление, показывающее его данные в Интернете ... но какМогу ли я показать извлеченные данные в табличном представлении в автономном режиме ..

, пожалуйста, помогите мне в коде ...

import UIKit
import CoreData

struct JsonData {
  var nameS: String
  var usernameS: String

  init(name: String, username: String) {        
    self.nameS = name
    self.usernameS = username
  }
}
class ViewController: UIViewController {

  @IBOutlet weak var tableView: UITableView!

  let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

  var iteamsArray = [JsonData]()

  override func viewDidLoad() {
    downloadJson()
  }

  func downloadJson(){        
    let urlStr = "https://jsonplaceholder.typicode.com/users"
    let url = URL(string: urlStr)

    URLSession.shared.dataTask(with: url!, completionHandler: {(data, response, error) in            
        guard let respData = data else {
          return
        }
        guard error == nil else {
          print("error")
          return
        }

        do{
          let jsonObj = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [[String: Any]]

          for items in jsonObj {
            let nameJson = items["name"] as? String
            let usernameJson = items["username"] as? String                    
            let coreData = NSEntityDescription.insertNewObject(forEntityName: "Details", into: self.context) as! Details
            coreData.name = nameJson
            coreData.username = usernameJson

            self.iteamsArray.append(JsonData(name: nameJson!, username: usernameJson!))
          }
          try self.context.save()

            //fetching from core data
          let fetchRequest : NSFetchRequest<Details> = Details.fetchRequest()
          let details = try self.context.fetch(fetchRequest)

          if details.count > 0 {                   
            for detail in details as [NSManagedObject] {                        
              let nameCore = detail.value(forKey: "name")
              let usernameCore = detail.value(forKey: "username")      
            }
          }

          DispatchQueue.main.async {
            self.tableView.reloadData()
          }                
        }
        catch {
          print("catch error")
        }            
      }).resume()
    }
}

// MARK: - TableView

extension ViewController: UITableViewDataSource, UITableViewDelegate {    
  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return iteamsArray.count
  }

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "JsonCell", for: indexPath) as! JsonTableViewCell        
    let aData = iteamsArray[indexPath.row]

    cell.labelName.text = aData.nameS
    cell.labelUsername.text = aData.usernameS

    cell.selectionStyle = .none
    return cell
  }
}

1 Ответ

0 голосов
/ 23 мая 2018

Прежде всего забудьте о пользовательской структуре.Используйте класс NSManagedObject в качестве массива источника данных.

var iteamsArray = [Details]()

В viewDidLoad first извлечение данных, если массив пуст, загрузите его из веб-службы

override func viewDidLoad() {
   let fetchRequest : NSFetchRequest<Details> = Details.fetchRequest()
   do {
       iteamsArray = try self.context.fetch(fetchRequest)
       if iteamsArray.isEmpty { 
           downloadJson()
       } else {
           self.tableView.reloadData()
       }
    } catch { print(error) }
}

В downloadJson() заменить

self.iteamsArray.append(JsonData(name: nameJson!, username: usernameJson!))

на

self.iteamsArray.append(coreData)

и удалить эти строки

//fetching from core data
   let fetchRequest : NSFetchRequest<Details> = Details.fetchRequest()
   let details = try self.context.fetch(fetchRequest)

   if details.count > 0 {                   
     for detail in details as [NSManagedObject] {                        
       let nameCore = detail.value(forKey: "name")
       let usernameCore = detail.value(forKey: "username")      
   }
}

В cellForRow получить значения непосредственноиз NSManagedObject объектов

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "JsonCell", for: indexPath) as! JsonTableViewCell        
    let aData = iteamsArray[indexPath.row]
    cell.labelName.text = aData.name
    cell.labelUsername.text = aData.userName
    cell.selectionStyle = .none
    return cell
  }
...