GCD返回主线程

3
在我的应用程序中,我使用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);

你的意思是第一次执行 loadSite: 是在后台线程上执行,然后总是在主线程上执行吗?backgroundQueue 是串行队列吗?你能展示一下如何创建它吗?你会销毁它吗? - Costique
@Costique,我已将该信息附加到我的问题中。很抱歉,我不知道它是否为串行队列,但我相信您可以告诉我。我几乎确定loadSite:第一次在后台线程上执行,然后始终在主线程上执行,但我不确定。有没有办法我可以检查?谢谢。 - Josh Sherick
因此,调度队列不是串行的。在loadSite:中放置NSLog(@“%s”,[NSThread isMainThread]?“main thread”:“background thread”);以确保它按照应该在后台执行。何时释放调度队列? - Costique
1个回答

2
使用dispatch_queue_create函数创建的队列是串行队列,因此提交给dispatch_queue_create的块将按顺序执行。
用法:
dispatch_queue_t backgroundQueue =
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

你的建议似乎有效...主线程上完成的所有操作都会同时调用,但我认为这只是因为所有站点在大约同一时间内完成加载。谢谢! - Josh Sherick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接