我正在编写一个iPhone应用程序,它应该从Web解析平面文件,从平面文件创建托管对象,然后应该在UITableView中显示它们。 保存和显示没有问题,但我无法得到一个好的Parser。
这就是我要解析的文件: 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来识别属性。
问题是:
任何想法或更简单的方法吗?
我真的很感激。在此先感谢: - )
答案 0 :(得分:1)
您也可以在后台进行所有解析,然后在解析信息时显示。
至于内存问题,请尝试执行临时自动释放池,并在循环中每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];
}
}
答案 1 :(得分:0)
递归下降(LL1)解析器非常简单,内存很轻,而且速度几乎和运行指针一样快。构建数据结构可能是主要的时间接受者。
答案 2 :(得分:0)
我终于能够解决我的性能问题了。
我在另一个类中有一个方法,它为不同的参展商广告标签。因此,它首先检查Tag是否已存储在数据库中,否则创建它。 随着我的数据库中不断增加的标签集,搜索过程花费的时间越来越长,这导致了很长的解析时间。
其他人遇到此问题:在“实施高效查找或创建”部分中查看Apple的Performance Core数据编程指南: