2015-10-08 1 views
0
Setup: Xcode version: 7.1 Beta, 
Firmware: iOS 9, 

Я пытаюсь получить доступ к значению из Core Data, чтобы получить общую сумму приобретенного продукта. Я проверил на вопрос о том же, но в Obj C. CoreData детали:iOS Swift Суммирование значений атрибута CoreData

Entity: Корзина

Атрибуты: Fname (String), fCost (Integer 16), fQuantity (Integer 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; 
})] 

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

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) 
} 
+0

Прошу прощения, я просто проясню. Я хочу получить grandTotal, который будет представлять собой сумму всех fQuantity * fCost. Для ex: fName: Milk, fQuantity: 2, fCost: 30. fName: Butter, fQuantity: 1, fCost = 60. Поэтому я хочу получить (2 * 30) + (1 * 60) = 160 -> grandTotal. Ваше решение работает, но оно дает мне fCost (30) Milk + fCost (60) Butter = 90. Это может быть легко, но много чего, и я думаю, что я просто делаю это слишком сложным. Можете ли вы обновить свое решение? Спасибо –

+0

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

+1

Хорошо, я получил его работу. Я удалил свой комментарий, поскольку это не имело смысла. Ваш ответ работает. Просто нужно было добавить valueForKey. Примите изменения, чтобы я мог принять ответ. Я недостаточно зрелый в программировании. Спасибо, что поняли. –