objective-c - GCD 回到主线程

标签 objective-c ios multithreading nsxmlparser grand-central-dispatch

在我的应用程序中,我使用 NSXMLParser 从几个 (6-10) 个网站加载信息,然后将信息加载到 View 中。

现在,我的应用程序已设置为循环遍历我主视图 Controller 中 viewDidLoad 中的站点,并在我创建的后台线程中加载它们。它在后台线程中执行此操作,因此用户不必在加载 View 之前等待所有站点加载完毕。

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 加载站点(所有委托(delegate)方法也正确实现)

-(void)loadSite:(NSString *)site{
    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:[self fullURLForSiteName:site]];
    [parser setDelegate:self];
    [parser parse];
    return;
}

当 NSXMLParser 完成文档并且 SiteData 实例填充了站点数据时,它将自身传递给主线程上我的主视图 Controller 中的一个方法。

- (void)parserDidEndDocument:(NSXMLParser *)parser{    
    dispatch_async(dispatch_get_main_queue(), ^(void) {
         [delegate successfullyLoadedSite:self];
    });
}

successfullyLoadedSite: 将传递的站点数据加载到 View 中并将其显示给用户。请注意,多个站点的数据显示在同一屏幕上。

我想要发生的事情:我希望每个站点的数据在加载时显示在屏幕上,而不必等到所有站点都完成加载才刷新 View 。

发生了什么:其中一个网站加载并显示,然后我必须等待所有其他网站加载,然后所有其他网站立即显示。

从控制台日志记录看来,一旦它第一次在主队列上调用 successfullyLoadedSite:,所有内容都会在主队列上运行。一旦主队列中的第一个 successfullyLoadedSite: 被调用,它会将所有站点加载到对象中,然后将它们加载到 View 中。

有什么想法吗?如果你不能告诉我我是多线程的新手。谢谢:)


编辑: 我这样创建 backgroundQueue:

dispatch_queue_t backgroundQueue;

并且在init

backgroundQueue = dispatch_queue_create("uni.que.identifier.bgqueue", NULL);

并在 dealloc 中释放它:

dispatch_release(backgroundQueue);

最佳答案

使用dispatch_queue_create函数创建的队列是串行队列, 然后 dispatch_queue_create 提交的 block 将按顺序执行。

使用:

dispatch_queue_t backgroundQueue =
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

关于objective-c - GCD 回到主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10039271/

相关文章:

ios - iOS-CGAffineTransformScale不会还原吗?

c - 这个文件操作线程安全吗?

objective-c - 在 iPhone 上使用 FFMPeg 解码 WMA

ios - 在ios中的电子邮件正文中插入包含行和列的表格

objective-c - 调试 EXC_BAD_ACCESS

ios - objc podspec 项目中的快速依赖

python - Python 中的多线程爬虫真的可以加快速度吗?

.net - 在 .NET3.5 中优化独立的 foreach 迭代

ios - CoreDataBooks 问题断言失败。

objective-c - 需要 CFRunLoopRun() 但希望它解除阻塞