【问题标题】:Update original NSMutableArray after filtering with NSPredicate使用 NSPredicate 过滤后更新原始 NSMutableArray
【发布时间】:2011-11-13 12:57:16
【问题描述】:

我最近开始为 iOS 平台编程,但现在我需要一些帮助来弄清楚如何做“某事”:

  • 对于我的应用程序,我获取一些 JSON 数据并将这些数据作为对象放入一个数组中
  • 这个数组被写入我自己的 PLIST 文件(在 docs 目录中)

现在当用户开始同步操作时我:

  • 从 PLIST 中获取数据
  • 获取来自 PLIST 的数组中某个对象的时间戳
  • 在新的 JSON 请求中使用时间戳(用于新数据)

到目前为止一切顺利。

现在我的(当前)问题 -> 在收到新数据(JSON req)后,我希望更新数组中这个“特定”对象的时间戳(并将其写入 Plist)。

使用 NSPredicate 我可以在主数组 (stampArr) 中找到正确的数据集。

NSString *documentsDir = [NSHomeDirectory()stringByAppendingPathComponent:@"Documents"];
NSString *plistPath = [documentsDir stringByAppendingPathComponent:@"stamps.plist"];

NSMutableArray *stampArr = [[NSMutableArray alloc] initWithContentsOfFile:plistPath];

NSPredicate *filter = [NSPredicate predicateWithFormat:@"eventid = 1"];
NSMutableArray *filteredStampArr = [stampArr filteredArrayUsingPredicate:filter];

但是现在,在我更新 filteredStampArr 之后,我想用过滤后数组中的数据更新主数组。

换句话说,我需要使用新的“时间戳”(对象的字段)更新数组中的对象。

我当然可以在更改过滤后的数组后使用 [stampArr addObject: [filteredStampArr copy]] 之类的东西,但这只会创建信息的副本。我想覆盖原来的对象。

不知何故(我认为)我需要一个“指针”来告诉我数据在原始数组中的位置,以便我可以直接在主数组中更改数据?

(我希望我的问题很清楚 - 如果没有,请说出来)

【问题讨论】:

  • 请注意,filteredArrayUsingPredicate 返回的是 NSArray 而不是 NSMutableArray
  • 你说得对,在我自己对代码的一些“思考”过程中改变了这一点。

标签: iphone ios nsarray nspredicate


【解决方案1】:

获取项目,在stampArr 中找到它的索引并将其替换为newItem

NSArray *filteredStampArr = [stampArr filteredArrayUsingPredicate:filter];
id item = [filteredStampArr objectAtIndex:0]; // id because the type of the item is not known

NSUInteger itemIndex = [stampArr indexOfObject:item];

[stampArr replaceObjectAtIndex:itemIndex withObject:newItem];

【讨论】:

    【解决方案2】:

    当你得到filteredArray时,你可以直接更新其中的对象(不是替换),并且会在主数组中更新。

    【讨论】:

    • 我会试试这个!我想,因为它是一个全新的数组,所以两个数组之间没有直接的联系。如果有(并更新过滤的,更新主要的)这将是最简单的解决方案,谢谢! (我会试试看)
    • 您会得到带有对象链接的数组,而不是对象的副本。两个数组都有指向相同对象的指针。
    【解决方案3】:

    仔细阅读 API!

    尝试:

    
    [stampArr  filterUsingPredicate:];
    

    【讨论】:

    • 如果我理解正确,使用 filterUsingPredicate 会给我一个主数组的子集(而不是一个新的),从而更新这个过滤数据的值,直接更新主数组?我会测试它!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多