iOS Swift Подведение итогов значений атрибутов CoreData

Setup: Xcode version: 7.1 Beta, 
Firmware: iOS 9, 

Я пытаюсь получить доступ к значению из базовых данных, чтобы получить полную сумму купленного продукта. Я проверил вопрос о том же, но это в Obj C. Детали Core Data:

Сущность: корзина

Атрибуты: fName (строка), fCost (целое число 16), fQuantity (целое число 16)

Получение кода, как показано ниже:

let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let managedContext : NSManagedObjectContext = appDelegate.managedObjectContext!
let fetchRequest = NSFetchRequest(entityName: "Cart")
fetchRequest.returnsObjectsAsFaults = false
do {
    let results = try managedContext.executeFetchRequest(fetchRequest)
    print("===\(results)")

} catch let error as NSError {
    print(error)
}

Вывод на печать (результаты), как показано ниже:

[<Tif.Cart: 0x7f8d19e60d00> (entity: Cart; id: 0xd000000000240000 <x-coredata://5D617B2C-35BC-43B4-BEC1-40AABA96C558/Cart/p9> ; data: {
    fCost = 30;
    fName = "Milk";
    fQuantity = 2;
}), <Tif.Cart: 0x7f8d19e7cd80> (entity: Cart; id: 0xd000000000280000 <x-coredata://5D617B2C-35BC-43B4-BEC1-40AABA96C558/Cart/p10> ; data: {
    fCost = 60;
    fName = "Butter";
    fQuantity = 1;
})]

Я использую ячейку tableView для отображения основных данных и выполнения общего.

var cart = [NSManagedObject]()
let order = cart[indexPath.row]
cell.fNLabel.text = order.valueForKey("fName")! as? String
cell.fCLabel.text = "Rs \(order.valueForKey("fCost") as! NSNumber)"
cell.fQLabel.text = "\(order.valueForKey("fQuantity") as! NSNumber)"
let fQ = order.valueForKey("fQuantity") as! Int
let fC = order.valueForKey("fCost") as! Int
let total = fQ * fC
totalArray.append(total)
grandTotal = totalArray.sum() // sum() is an extension that calculates the sum of integer values
print(grandTotal)
grandTotalLabel.text = "\(grandTotal)"
cell.fTLabel.text = "Rs \(total)"

Я получаю grandTotal, но каждый раз, когда я беру таблицу, значение добавляется к последнему значению.

Я также читал об использовании опции NSFetchRequestController, но я вообще не мог с ней работать.

1 ответ

Решение

Похоже, вы рассчитываете общую сумму в tableView:cellForRowAtIndexPath: метод. Это определенно не правильное место для этого, так как он будет рассчитывать только общую сумму для видимых ячеек.

let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let managedContext : NSManagedObjectContext = appDelegate.managedObjectContext!
let fetchRequest = NSFetchRequest(entityName: "Cart")
fetchRequest.returnsObjectsAsFaults = false
do {
    let results = try managedContext.executeFetchRequest(fetchRequest)
    print("===\(results)")

    // Calculate the grand total...
    var grandTotal = 0
    for order in results {
        let fQ = order.valueForKey("fQuantity") as! Int
        let fC = order.valueForKey("fCost") as! Int
        grandTotal += fC * fQ
    }
    print("Grand total = \(grandTotal)")

} catch let error as NSError {
    print(error)
}
Другие вопросы по тегам