2012-09-19 142 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