Данные не будут загружаться из локального хранилища данных ядра - PullRequest
0 голосов
/ 25 мая 2019

Я сохранил несколько объектов базовых данных в своем хранилище основных данных, а также напечатал количество элементов в объекте базовых данных, и там указано 4. К сожалению, он никогда не достигает метода cellForRowAtIndexPath для загрузки данных, которых у меня нет идея почему.

Вот мой контроллер просмотра:


import UIKit
import CoreData

class CustomersViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, DataReceived {

    //MARK: - Variables
    @IBOutlet weak var customersTableView: UITableView!
    var customers = [Customer]()
    var customersModel = [CustomerModel]()
    var context = PersistanceService.context

    //MARK: - Lifecycle Methods
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = #colorLiteral(red: 0.4772838354, green: 0.7987893224, blue: 0.9529026151, alpha: 1)
        customersTableView.backgroundColor = #colorLiteral(red: 0.4772838354, green: 0.7987893224, blue: 0.9529026151, alpha: 1)
        if loadData() {
            print("loading items from local persistancy")
        } else {
            print("local persistancy is empty")
        }
        customersTableView.dataSource = self
        customersTableView.delegate = self
        customersTableView.register(UINib(nibName: "CustomerCell", bundle: nil), forCellReuseIdentifier: "customer")

    }

    //MARK: - Tableview delegate & datasource methods
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "customer", for: indexPath) as! CustomerCell
        let currentCustomer = customersModel[indexPath.row]
        cell.nameAndRegionLabel.text = "\(currentCustomer.name!) from \(currentCustomer.region!)."
        cell.genderAndAgeLabel.text = "\(currentCustomer.gender!), \(currentCustomer.age) Years Old."
        cell.layer.borderColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1)
        cell.layer.borderWidth = 1
        cell.layer.cornerRadius = 20
        cell.clipsToBounds = true

        return cell
    }

    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        return true
    }

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == .delete {
            let item = customersModel.remove(at: indexPath.row)
            context.delete(item)
            tableView.deleteRows(at: [indexPath], with: .fade)
            saveData()

        }

    }


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

    //MARK: - Segue methods

    @IBAction func moveToNewCostumerVC(_ sender: Any) {
        performSegue(withIdentifier: "newCustomer", sender: self)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "newCustomer" {
            let newCustomerVC = segue.destination as! NewCustomerViewController
            newCustomerVC.delegate = self
        }
    }

    // MARK: - New Customer Data Delegate Method & Saving to Core Data
    func dataReceived(customer: CustomerModel) {
        customersModel.append(customer)
        customersTableView.reloadData()
        print(customersModel.count)
        saveData()
        customersTableView.reloadData()
    }

    func saveData(){
        do {
            try context.save()
            print("data saved successfully")
        } catch {
            print("error saving context, \(error.localizedDescription)")
        }
    }

    //MARK: - Retreving From Core Data
    func loadData()->Bool{

        let fetchRequest : NSFetchRequest<CustomerModel> = CustomerModel.fetchRequest()
        do {
            var customersFromPersistancy = try PersistanceService.context.fetch(fetchRequest)
            print(customersFromPersistancy.count)
            if customersFromPersistancy.count == 0 {return false}
            customersFromPersistancy = customersModel
            return true
        } catch {
            print("error fetching from core data, \(error)")
            return false
        }
    }
}

Как вы можете видеть, в функции loadData () я печатаю количество объектов в массиве объектов базовых данных, и результат при запуске приложения равен 4. После этого я вызываю метод tableView.reloadData (), который должен (?) вызвать cellForRowAtIndexPath и перезагрузить набор данных с нуля, и он никогда этого не сделает. Спасибо!

1 Ответ

1 голос
/ 25 мая 2019

В нагрузке вы меняете эту переменную

if customersFromPersistancy.count == 0 {return false}
   customersFromPersistancy = customersModel <<< here

в то время как в numberOfRowsInSection вы возвращаете пустой массив

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

, что приводит к пустому tableView, поэтому обязательно измените содержимое массива dataSource tableView

вы используете

let currentCustomer = customersModel[indexPath.row] 

внутри cellForRowAt, что не рекомендуется использовать в качестве источника данных много массивов, поэтому убедитесь, что это всего лишь 1


Edit:

    let fetchRequest : NSFetchRequest<CustomerModel> = CustomerModel.fetchRequest()
    do {
        var customersFromPersistancy = try PersistanceService.context.fetch(fetchRequest)
        print(customersFromPersistancy.count)
        customersModel = customersFromPersistancy 
        if customersFromPersistancy.count == 0 {return false} 
        return true
    } catch {
        print("error fetching from core data, \(error)")
        return false
    }

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return customersModel.count
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...