Swift - загрузка / сохранение из CoreData генерирует повторяющиеся записи - PullRequest
0 голосов
/ 01 июня 2018

Я столкнулся с проблемой, когда я могу сохранить и загрузить в CoreData и из него в Swift для своего приложения для iOS, но я столкнулся с проблемой, когда пытался защитить дубликаты записей, но, похоже, это не работает.кто-нибудь может сказать мне, где я ошибся?Спасибо!

Мой класс ViewController:

import UIKit
import CoreData

class ViewController: UIViewController, UITableViewDelegate, 
UITableViewDataSource {

    @IBOutlet weak var headerLabel:UILabel!
    @IBOutlet weak var myTableView: UITableView!

    var lenders = [LenderData]()
    var lendersTemp = [LenderData]()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.myTableView.rowHeight = 90
        myTableView.delegate = self
        myTableView.dataSource = self

        let fetchRequest: NSFetchRequest<LenderData> = LenderData.fetchRequest()

        do {
            let lenders = try PersistenceService.context.fetch(fetchRequest)
            self.lenders = lenders
        } catch {
            // Who cares....
        }


        downloadJSON {
            for tempLender in self.lendersTemp {
                if !self.lenders.contains(where: {$0.id == tempLender.id}) {
                    self.lenders.append(tempLender)
                }
            }
            self.lendersTemp.removeAll()
            PersistenceService.saveContext()
            self.myTableView.reloadData()
        }
    }

    func downloadJSON(completed: @escaping () -> ()) {
        let url = URL(string: "https://api.kivaws.org/v1/loans/newest.json")

        let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
            if error != nil {
                print("JSON not downloaded")
            } else {
                if let content = data {
                    do {
                        let myJSONData = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject
                        var imageID:Int64 = -1
                        var country:String = "N/A"
                        var latLongPair:String = "0.000000 0.000000"
                        var town:String = "N/A"

                        if let loans = myJSONData["loans"] as? NSArray {
                            for i in 0...loans.count-1 {
                                if let lender = loans[i] as? NSDictionary {
                                    if let imageData = lender["image"] as? NSDictionary { imageID = imageData["id"] as! Int64 }
                                    if let countryData = lender["location"] as? NSDictionary {
                                        country = countryData["country"] as! String
                                        town = countryData["town"] as! String
                                        if let geo = countryData["geo"] as? NSDictionary {
                                            latLongPair = geo["pairs"] as! String
                                        }
                                    }
                                    let newLender = LenderData(context: PersistenceService.context)
                                    newLender.id = lender["id"] as! Int64
                                    newLender.name = lender["name"] as? String
                                    newLender.image_id = imageID
                                    newLender.activity = lender["activity"] as? String
                                    newLender.use = lender["use"] as? String
                                    newLender.loan_amount = lender["loan_amount"] as! Int32
                                    newLender.funded_amount = lender["funded_amount"] as! Int32
                                    newLender.country = country
                                    newLender.town = town
                                    newLender.geo_pairs = latLongPair
                                    self.lendersTemp.append(newLender)
                                }
                            }
                        }
                        DispatchQueue.main.async {
                            completed()
                        }
                    } catch {
                        print("Error occured \(error)")
                    }
                }
            }
        }
        task.resume()
    }
}

EDIT

Добавлена ​​часть кода, где я заполняю массив lendersTemp

1 Ответ

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

Я цитирую Мэтта на это из комментариев:

Итак ... Вы добавляете self.lendersTemp в фоновом потоке, но читаете его в основном потоке.Вместо этого избавьтесь от него и просто передайте данные прямо через выполненную функцию.

Именно это я и сделал.И это сработало

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...