在我的应用程序中,我使用 NSXMLParser 从几个 (6-10) 网站加载信息,然后将信息加载到视图中。
现在,我的应用程序已经设置好,它可以循环访问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);