【问题标题】:What is the best way to parse an XML in background using NSTimer使用 NSTimer 在后台解析 XML 的最佳方法是什么
【发布时间】:2011-11-30 08:17:10
【问题描述】:

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

我已经有一个使用 TBXML 的 XML 解析器:

- (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 时,需要向 UINavigationController 推送一个新的 UITableView,并根据选中的单元格值取数据;由于在解析期间 NSManagedContext 为空(直到它被填充),应用程序由于“无效谓词:nil RHS”而崩溃。

我的代码现在变得非常大,所以我不能把它贴在这里,但请告诉我你需要查看代码的哪一部分,我会放在这里。

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

提前致谢, 狐狸

【问题讨论】:

    标签: ios uitableview core-data xml-parsing


    【解决方案1】:

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

    您的解决方案应该如下:

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

    请参阅线程上的 Apple Documentation,了解在 iOS 下实现此功能的介绍。

    【讨论】:

    • 感谢您的建议,我会尝试处理并尝试实施。我深入研究了当前的问题,我注意到当我尝试加载新数据时。我现有的 var @property (retain, non atomic) NSMutableArray *entityArray 变空了。我会尝试一下你的建议,看看我能不能更进一步。谢谢
    猜你喜欢
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    相关资源
    最近更新 更多