【问题标题】:Parsing my flat-file on iPhone is a pain in the ***, please Help me out在 iPhone 上解析我的平面文件很痛苦,请帮帮我
【发布时间】:2011-04-07 18:10:48
【问题描述】:

我正在编写一个 iPhone 应用程序,它应该解析来自网络的平面文件,从平面文件创建托管对象,然后应该在 UITableView 中显示它们。 保存和显示都没有问题,但我就是无法掌握一个好的解析器。

这就是我要解析的文件: Flat-file

据我所知,我不能使用 NSXMLParser 来完成这项任务(因为显然没有标签)。

所以我一开始尝试编写一个 NSScanner 来获得有趣的属性 --> 没有成功

现在我正在使用这种方法:

- (void) parseMemberDataWithURL: (NSString *)urlString
{
    self.memberTempCounter = 1;

    //Get data from web
    self.downloadedText = [NSString stringWithContentsOfURL: [NSURL URLWithString:    urlString] encoding:NSUTF8StringEncoding error:nil ];

    memberArray = [downloadedText componentsSeparatedByString:@";"];

    while (self.memberTempCounter<[memberArray count])
    {
        [[ExhibitorController sharedController] createExhibitorWithName:[memberArray objectAtIndex:self.memberTempCounter]
                                                                  street:[memberArray objectAtIndex:self.memberTempCounter+2]
                                                                    zip:[memberArray objectAtIndex:self.memberTempCounter+3]
                                                                   city:[memberArray objectAtIndex:self.memberTempCounter+4]
                                                                  email:[memberArray objectAtIndex:self.memberTempCounter+7]
                                                                  phone:[memberArray objectAtIndex:self.memberTempCounter+5]
                                                                website:[memberArray objectAtIndex:self.memberTempCounter+8]
                                                        produktbereiche:[[memberArray objectAtIndex:self.memberTempCounter+9] componentsSeparatedByString:@","]];
        self.memberTempCounter= self.memberTempCounter+13;
    } 
}

我正在使用 memberTempCounter 来识别属性。

问题是:

  • 这仅适用于 4 次中的 3 次。应用程序崩溃 4 次中的 1 次,我不知道为什么...
  • 该方法的性能类似于 1962 年大众甲壳虫。在我的 iPhone 3G 上解析整个数据块最多需要 3 分钟

有任何想法或更简单的方法吗?

我将非常感激。提前致谢:-)

【问题讨论】:

  • 啊差点忘了:Device creshs with:: Unknown thread crashed with unknown flavor: 5, state_count: 1 好像是内存问题???

标签: iphone performance parsing flat-file


【解决方案1】:

递归下降 (LL1) 解析器非常简单,占用内存少,而且就速度而言,它们的运行速度几乎与您在字符中运行指针一样快。构建数据结构可能是主要的耗时。

【讨论】:

    【解决方案2】:

    您不妨在后台进行所有解析,然后在信息被解析时显示。

    至于内存问题,尝试做临时自动释放池,并通过循环每 50 次左右迭代释放一次。

    int count = 0;
    NSAutoreleasePool * loopPool = [[NSAutoreleasePool alloc] init];
    while(someInsanelyLargeCondition){
    
        // Do your stuff here
        // .............
    
        count++;
        if (count > 50) {
            count = 0;
            [loopPool release];
            loopPool = [[NSAutoreleasePool alloc] init];
        }
    }
    

    【讨论】:

    • 谢谢。我不明白 Autoreleasepool 的想法。我在我的方法中不发布任何东西,而是将数据直接写入数据库。最近我在考虑解析文件,将它们存储在临时 NSArray 中以更快地显示它们并通过后台线程处理保存。使用这种方法有什么问题吗?或者创建 2 个额外的线程来将解析后的数据保存到数据库中怎么样?
    • 虽然你不自动释放,但你调用的任何方法中的任何东西都可以使用自动释放。
    【解决方案3】:

    我终于能够解决我的性能问题。

    我在另一个类中有一个方法,它为不同的参展商广告标签。因此它首先检查标签是否已经存储在数据库中或者创建它。 随着我数据库中的标签集越来越多,搜索过程花费的时间越来越长,这导致解析时间变长。

    其他有此问题的人:在“高效实现查找或创建”部分中查看苹果的性能核心数据编程指南:

    http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CoreData/Articles/cdImporting.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多