使用NSTimer在后台解析XML的最佳方法是什么?

时间:2011-10-04 01:39:46

标签: ios uitableview core-data xml-parsing

我需要以规则的间隔异步解析XML,以便当用户使用“PullToReload”重新加载UITableView时,它会加载更新的值。我的赌注是使用NSTimer ......

我已经有一个使用TBXML的XML Parser:

- (void) xmlParserWrapper
{
...
TBXMLParser *xmlParser = [[TBXMLParser alloc] initWithContext:context];
[xmlParser performSelectorInBackground:@selector(parseXMLFileAtURL:) withObject:xmlUrl];
}

所以我尝试使用NSTimer

{
...
[NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(xmlParserWrapper) userInfo:nil repeats:YES];
}

只要用户在解析时不会触摸GUI,这样就可以正常工作。但是当用户点击UITableViewCell时,它需要将新的UITableView推送到UINavigationController并根据所选的单元格值获取数据;由于NSManagedContext在解析期间是空的(直到它被填充),应用程序因“无效谓词:nil RHS”而崩溃。

我的代码现在变得非常大,所以我无法将其粘贴到此处,但请告诉我您需要查看的代码部分,我会将其放在此处。

基本上,我只需要在后台定期进行XML解析,不会使应用程序崩溃。我还需要它在另一个线程中,因此当用户导航到UI时它不会阻止MainThread。

提前致谢, dfox

1 个答案:

答案 0 :(得分:0)

我不是iOS专家,但是这个问题在任何GUI框架中都很常见,通常通过使用后台或工作线程执行耗时的任务来解决,让主GUI线程处理用户交互。 / p>

您的解决方案应如下:

  1. 在应用程序启动时创建工作线程。
  2. 使用容器(list)类来包含要为工作线程发布工作的“工作队列”。您需要实现自己的类或结构来描述要执行的每个工作单元。
  3. 使用同步机制来控制对两个线程的工作队列的访问。
  4. 在工作线程中实现尽可能多的工作(即让它检索并解析XML)。我认为网络访问是这里最耗时的任务。
  5. 获取工作线程以使用新内容更新UI元素。此处还有一个同步问题需要解决。
  6. 在应用程序终止时终止工作线程。
  7. 在线程上查看此Apple Documentation,了解在iOS下实现此功能的信息。

相关问题