2012-09-19 134 views
0

我有一個簡單的數據模型(核心數據),但這裏是它的一個精簡版:KVC - 過濾設置

Account 
---------------------------------------------------- 
NSSet<Transaction> transactions 

Transaction 
---------------------------------------------------- 
Account account 
NSNumber amount 
NSNumber type (type ∈ (0->'Credit', 1->'Debit')) 

我希望得到一個帳戶的總餘額,但是,我不知道想要將借記標記爲負數。我只是希望它是一種借記類型的金額。

目前,我才中添加的借記,我能得到通過此功能,餘額在賬戶:

- (NSNumber *)currentBalance 
{ 
    return [self.transactions valueForKeyPath:@"@sum.amount"]; 
} 

很顯然,如果我做借記負只會工作。這裏有沒有一個優雅的解決方案,或許可以將該套件過濾爲信用和借記,對這些信息進行求和並執行差異?這會保持準確性嗎?我研究過NSPredicate,但我不知道如何繼續。

回答

0

這裏是我的研究使我:

- (NSNumber *)currentBalance 
{ 
    // credits 
    NSPredicate *creditPredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { 
     return [((Transaction *)evaluatedObject).type intValue] == kTransactionTypeCredit; 
    }]; 

    NSSet *credits = [self.transactions filteredSetUsingPredicate:creditPredicate]; 

    NSDecimalNumber *totalCredits = [credits valueForKeyPath:@"@sum.amount"]; 

    // debits 
    NSPredicate *debitPredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { 
     return [((Transaction *)evaluatedObject).type intValue] == kTransactionTypeDebit; 
    }]; 

    NSSet *debits = [self.transactions filteredSetUsingPredicate:debitPredicate]; 

    NSDecimalNumber *totalDebits = [debits valueForKeyPath:@"@sum.amount"]; 

    // do the math 
    return [totalCredits decimalNumberBySubtracting:totalDebits]; 
} 

雖然它的工作原理,它似乎是工作過量。這是最好的方法嗎?

+0

使用KVC的@sum功能看起來像很多工作。 –

+1

您也可以將另一個屬性添加到您的對象以返回帶符號的值和總和。或者只是溝通@sum並通過它們循環並相應地減去?順便說一句,您可以在塊簽名中使用事務類型,並將塊類型保存到塊中。 (所以,而不是'id評估對象'只是使用'交易*交易') –

+0

@ RoryO'Bryan:我喜歡使用新的財產的建議。太精彩了。非常感謝你!有時我需要退後一步,思考更簡單的解決方案。 – Josh