使用密钥更新阵列中的自定义对象

时间:2015-12-19 08:23:28

标签: ios objective-c

标题可能有点不清楚。但这就是我想要实现的目标:

我有NSMutableArray个自定义对象,例如

[
Custom Object 1,
Custom Object 2,
Custom Object 3,
..
..
..
Custom Object 10
]

Custom object由以下变量组成:

id, name, date, seen_count;

我的值为id,例如10

现在我希望得到Index custom object id=10 NSMutableArray Row/Cell,以便我可以更新该对象并重新加载特定的UITableView {{1}}反映变化。

P.S:一种方法是循环遍历数组。但还有其他方法可以达到这个目的吗?

2 个答案:

答案 0 :(得分:2)

使用NSPredicate ::

NSUInteger positionOfChange =  [yourArray indexOfObject:object];

// update your cell that is on position positionOfChange integer value

获取array ::

中的Object索引
 records = LOAD '/home/user/localinputfiles/pass_fail.txt' USING PigStorage('\t') as (hour:int,result:chararray);

 records_grp = GROUP records BY hour;

 records_each = FOREACH records_grp 
                   {
                      passed_bag = FILTER records BY result == 'Pass';
                      failed_bag = FILTER records BY result == 'Fail' ;

                    GENERATE group, COUNT(passed_bag) as pass_cnt, COUNT(failed_bag) as fail_cnt ,COUNT(records) as total_cnt;
                   };

 dump records_each;

希望这会对代码段中的任何拼写错误提供帮助和抱歉。

注意:: 如果您没有确认该对象将始终存在于id,而不是首先检查已过滤的数组是否具有对象,然后再进一步,否则它将崩溃。 如果您不确定,请不要在filteredArrayUsingPredicate中检查lastobject。

答案 1 :(得分:2)

由于数组只能通过索引访问,因此迭代数组是唯一的方法。您可以显式循环,查找适当的对象或隐式使用indexOfObjectPassingTest的{​​{1}}方法。这种方法的优点是它只需要迭代到第一个匹配,而NSArray需要迭代整个数组。

filteredArrayUsingPredicate

另一种方法是使用辅助NSDictionary来存储对象的索引。这需要单个迭代数组来构建字典,但允许您更快地定位给定对象。

为方便起见,我假设在这种情况下id是一个字符串;如果它是一个int,那么你需要将其装入NSNumber:

NSInteger objectIndex=[myArray indexOfObjectPassingTest:^BOOL(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    CustomObject *myObject=(CustomObject *)obj;
    if (obj.id==targetid) {   // Assumes id is an int, change the test as appropriate if it is a string or other object
        *stop=YES;
    }
}];

然后,要访问对象,只需使用字典

NSMutableDictionary auxDict=[NSMutableDictionary new];
for (i=0;i<myArray.count;i++) {  
   CustomObject *obj=myArray[i];
   [auxDict addObject:[NSNumber numberWithInt:i] forKey:obj.id];
}