2013-10-13 33 views
0

有两个文件。我们称它们为fileOnefileTwoNSDictionary:比较NSDictionaries

每个都有几个具有相同名称的NSMutableDictionary属性。下面列出几条:

@property (retain, nonatomic) NSMutableDictionary * lunchStartTimeObject; 
@property (retain, nonatomic) NSMutableDictionary * lunchLocationNameObject; 
@property (retain, nonatomic) NSMutableDictionary * lunchLocationAddressObject; 
@property (retain, nonatomic) NSMutableDictionary * activity1NameObject; 
@property (retain, nonatomic) NSMutableDictionary * activity1StartTimeObject; 
@property (retain, nonatomic) NSMutableDictionary * activity1LocationNameObject; 
@property (retain, nonatomic) NSMutableDictionary * activity1CommentsFieldObject; 
@property (retain, nonatomic) NSMutableDictionary * activity1LocationAddressObject; 
@property (retain, nonatomic) NSMutableDictionary * activity2NameObject; 
@property (retain, nonatomic) NSMutableDictionary * activity2StartTimeObject; 
@property (retain, nonatomic) NSMutableDictionary * activity2LocationNameObject; 
@property (retain, nonatomic) NSMutableDictionary * activity2CommentsFieldObject; 
@property (retain, nonatomic) NSMutableDictionary * activity2LocationAddressObject; 

我想通过调用下面的方法(或类似的东西)与两个文件同名的字典比较:

-(NSMutableDictionary *)cellColorForChanges:(NSMutableDictionary *)newdictionary :(NSMutableDictionary *)oldDictionary; 
{ 
    if(![newdictionary isEqualToDictionary:oldDictionary]) 
    { 
     [newdictionary setValue:@"UIColor yellowColor" forKey:@"cellColor"]; 
    } 
    return newdictionary; 
} 

我试图避免手动为每个NSMutableDictionary编写代码。有没有办法避免以下:

if(![fileOne.lunchStartTimeObject isEqualToDictionary:fileTwo.lunchStartTimeObject]) 
{ 
    fileOne.lunchStartTimeObject setValue:@"UIColor yellowColor" forKey:@"cellColor"]; 
} 

我有麻烦找出最有效的方式来完成上述。是否有可能发送每个字典到一个方法和取回字典(更新与另一个关键,如果它不相等)?或者我想避免的是不可避免的?

+0

那么,你最终要比较的字典。谢天谢地,isEqualToDictionary是逐项比较的,所以你不必编码。当然,您可以通过将字典放入数组并编写代码来遍历数组并进行比较来避免一些额外的编码,而不必为每个数据单独编写一个比较。但是,这不会更“有效”,执行方面。你也可以首先比较散列值,知道散列不匹配意味着不相等。但是,如果大多数不匹配,这只会得到回报 - 你仍然必须进行比较以确保“平等”。 –

回答

0

由于您没有充分抽象出对象,因此遇到此问题。在我看来,你上面的财产清单是荒谬的多余的。即使你提供的简单代码很难阅读。

试着以更概念的方式思考你的问题。尝试考虑可能封装您正在寻找的功能的对象。

看你的属性,你可能想这样

@interface Activity : NSObject 

@property (nonatomic, strong) NSString *name; 
@property (nonatomic, strong) NSDate *startTime; 
@property (nonatomic, strong) Location *location; 

-(BOOL)isEqualToActivity:(Activity*)activity; 

@end 

类也许你需要存储有关位置的详细信息的位置类;也许你可以使用更多的字段,如firstName,lastName;也许你需要一个type(枚举或字符串)属性,告诉它是什么样的活动等 - 你明白了。

如图所示,你可以写你自己的比较方法,你可以调整,以允许更多或更少的严格的资本或小写字母,数字格式等

+0

感谢您的建议。我喜欢使用字典存储text&detailText信息并将它们存储到数组中。然后我把数组放在sectionArray中。接下来,我在sectionArray上枚举ObjectsUsingBlock,如果array.count> 1,则显示它们:cell.textLabel.text = [cellManagedObject valueForKey:@“text”]; cell.detailTextLabel.text = [cellManagedObject valueForKey:@“detailText”];我相信有更好的方法来实现这一点,但现在这是为我工作。你有一种技术来显示一个基于用户提供的数据显示单元格的UITableViewController吗? – user1107173

+0

部分有时是空的;章节显示订单更改;不是所有的单元格都会有cell.detailTextLabel.text。 – user1107173

+0

您在评论中提出的问题(如何填充表格视图)完全不同。这是关于适当的数据源方法,而不是你如何设计你的类。 – Mundi