Objective C plist搜索和随机输入

时间:2011-07-12 13:01:06

标签: iphone objective-c dictionary plist

关于iphone的plists和objective c的另外几个问题。 这两个问题都与我的plist有关,可以在我上一篇last question中看到。

首先要做的是搜索,我知道这是可能的,但是正确的方法是什么?我应该将所有可搜索的对象拉入数组并使用它来构建表吗?或者是否可以通过plist迭代并只是显示匹配?或者我有其他方式在这里失踪?作为下面的一个简单示例,我想回到两个'琼斯'结果:

<dict>
    <key>A</key>
    <array>
        <string>A Jones</string>
        <string>A King</string>
    </array>
    <key>T</key>
    <array>
        <string>T Jones</string>
        <string>T King</string>
    </array>

其次,是否有可能从plist中调出一个随机结果,我很确定它是,但是再次提出这个问题的正确方法是什么?

我会承认找到一个有点痛苦的因素,因为在我看来,这似乎是一种垃圾形式的xml。而且我仍然发现通过plist字典迭代在某种程度上相当混乱。不过,对这两个问题的任何想法都会受到高度赞赏。

谢谢:)

1 个答案:

答案 0 :(得分:2)

显然可以使用NSDictionary迭代-(NSEnumarator *)objectEnumerator;值,您还可以使用-(NSArray *)allValues;检索所有值,还可以查看-(NSSet *)keysOfEntriesPassingTest:(BOOL (^)(id key, id obj, BOOL *stop))predicate;返回包含值的键的NSSet已通过测试(来自Mac OS X 10.6)。

关于第二个问题,我认为没有“更好”的方式。我将如何做到这一点:

  1. 使用NSDictionary
  2. 获取-(NSArray *)allKeys;的所有密钥
  3. 获取随机数
  4. 使用-(id)objectAtIndex:(NSUInteger)anIndex;
  5. 在数组中选取一个键
  6. 使用以下内容检索词典中的相应对象:-(id)objectForKey:(id)aKey;
  7. 然后你得到了你的对象。 希望这会有所帮助。

    修改

    这是一种迭代NSDictionary中的值的简单方法:

    // assuming you already have a well initialized dictionary
    // first create a container
    NSMutableArray *selectedObjects = [[NSMutableArray alloc] init];
    // then retrieve an enumerator for the dictionary
    NSEnumerator *e = [theDictionary objectEnumerator];
    id anObject;
    // iterate...
    while((anObject = [e nextObject]) != nil) {
        // do what you want with the object
        // in your case each object is an array
        NSArray *theArray = (NSArray *)anObject;
        // ...
        // if you find any of them interesting put it in the first array
        if([[theArray objectAtIndex:0] isEqualToString:@"Jones"]) {
            [selectedObjects addObject:[theArray objectAtIndex:0]];
        }
    }
    // here are the selected objects in selectedObjects.
    // you won't forget to release selectedObjects when you don't need it anymore