在我的应用程序中,我使用NSXMLParser从6-10个网站加载信息,然后将信息加载到视图中。
目前,我的应用程序是这样设置的:在我的主视图控制器中,在viewDidLoad中循环遍历这些站点,并在我创建的后台线程中加载它们。这样做是为了让用户在视图加载之前不必等待所有站点都加载完毕。
在 SiteData 中,我使用 NSXMLParser 加载网站(所有代理方法也已正确实现)。
当NSXMLParser完成文档解析,SiteData实例中收集了站点的数据后,它将自己传递到主视图控制器的一个方法中,在主线程上执行。
成功加载站点:
我想发生什么:我希望每个站点的数据在加载时都出现在屏幕上,而不必等待所有站点完成加载以刷新视图。
正在发生的事情:其中一个站点加载并显示,然后我必须等待所有其他站点加载,然后所有其他站点同时显示。
从控制台日志中看来,一旦第一次在主队列上调用
有什么想法?如果你不能告诉我,我对多线程很陌生。谢谢 :)
编辑: 我像这样创建
在
在 `dealloc` 中释放它,使用以下代码:
目前,我的应用程序是这样设置的:在我的主视图控制器中,在viewDidLoad中循环遍历这些站点,并在我创建的后台线程中加载它们。这样做是为了让用户在视图加载之前不必等待所有站点都加载完毕。
for (NSMutableDictionary *dict in self.sitesArray) {
SiteData *data = [[SiteData alloc] init];
[data setDelegate:self];
dispatch_async(backgroundQueue, ^(void) {
[data loadSite:[dict objectForKey:@"SiteName"]];
});
}
在 SiteData 中,我使用 NSXMLParser 加载网站(所有代理方法也已正确实现)。
-(void)loadSite:(NSString *)site{
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:[self fullURLForSiteName:site]];
[parser setDelegate:self];
[parser parse];
return;
}
当NSXMLParser完成文档解析,SiteData实例中收集了站点的数据后,它将自己传递到主视图控制器的一个方法中,在主线程上执行。
- (void)parserDidEndDocument:(NSXMLParser *)parser{
dispatch_async(dispatch_get_main_queue(), ^(void) {
[delegate successfullyLoadedSite:self];
});
}
成功加载站点:
successfullyLoadedSite:
将传递的站点数据加载到视图中并显示给用户。请注意,多个站点的数据显示在同一屏幕上。我想发生什么:我希望每个站点的数据在加载时都出现在屏幕上,而不必等待所有站点完成加载以刷新视图。
正在发生的事情:其中一个站点加载并显示,然后我必须等待所有其他站点加载,然后所有其他站点同时显示。
从控制台日志中看来,一旦第一次在主队列上调用
successfullyLoadedSite:
,所有内容都会在主队列上运行。一旦在主队列上第一次调用successfullyLoadedSite:
,它就会将所有站点加载到对象中,然后将它们加载到视图中。有什么想法?如果你不能告诉我,我对多线程很陌生。谢谢 :)
编辑: 我像这样创建
backgroundQueue
:dispatch_queue_t backgroundQueue;
在
init
中。backgroundQueue = dispatch_queue_create("uni.que.identifier.bgqueue", NULL);
在 `dealloc` 中释放它,使用以下代码:
dispatch_release(backgroundQueue);
loadSite:
是在后台线程上执行,然后总是在主线程上执行吗?backgroundQueue
是串行队列吗?你能展示一下如何创建它吗?你会销毁它吗? - CostiqueloadSite:
第一次在后台线程上执行,然后始终在主线程上执行,但我不确定。有没有办法我可以检查?谢谢。 - Josh SherickloadSite:
中放置NSLog(@“%s”,[NSThread isMainThread]?“main thread”:“background thread”);
以确保它按照应该在后台执行。何时释放调度队列? - Costique