在我的应用程序中,我使用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);发布于 2012-04-06 05:47:16
使用dispatch_queue_create函数创建的队列是串行队列,然后dispatch_queue_create提交的块按顺序执行。
用途:
dispatch_queue_t backgroundQueue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);https://stackoverflow.com/questions/10039271
复制相似问题