我能正确理解这些概念吗?

时间:2014-09-08 01:12:00

标签: multithreading web-services grand-central-dispatch

在我的大部分采访中,我都被问及网络服务和多线程。我没有做过,所以我决定更多地了解 Web服务使用Grand Central Dispatch进行多线程

  1. 对于Web服务,我理解它的方式是您需要使用诸如NSURLConnection之类的类来获取数据。基本上设置一个新的NSURL,然后是一个连接,然后是一个请求。您还需要使用API​​的方法,例如didConnectdidReceiveDatadidFailLoadWithError。收到数据(通常为JSON或XML格式并存储为NSData对象)后,您可以存储它并通过它进行解析。有多种方法可以解析它,例如使用SBJSON或NSXMLParser。然后,您可以根据需要使用它。

  2. 对于多线程,Grand Central Dispatch是一种多线程的c风格方式。基本上,当你需要远离主线程进行大量拖运以避免应用程序冻结时,可以使用它。您可以同步或异步调度。异步意味着主线程上的方法将继续执行,同步意味着它不会。您永远不需要与NSURLConnection一起使用GCD,因为NSURLConnection已经在后台执行其工作,然后调用主线程中的委托。但是,对于保存和解压缩文件,您应该使用GCD。当您致电dispatch_async时,您会传入一个调度队列。您可以使用串行队列或并发队列。串行队列将按照它们到达的顺序一次一个地执行队列中的任务。这是默认设置。对于并发队列,可以同时执行并发执行的任务。

  3. 我的第一个问题是,我对这两个概念有正确的理解吗?我知道有很多来了解GCD,但我只是想确保我的基本想法是正确的。另外,对于GCD,为什么有人想要同步发送,这不会破坏多线程的目的吗?

2 个答案:

答案 0 :(得分:2)

同步调度的唯一原因是阻止当前代码继续,直到关键部分完成。

例如,如果您想从共享资源中获取一些值并立即使用它,则需要同步调度。如果当前代码不需要等待关键部分完成,或者它只是向同一个串行队列提交其他后续任务,则通常首选提交异步。

答案 1 :(得分:1)

您可以使用 dispatch_async dispatch_sync 调用进行同步请求并将其分派。它将完全在后台运行。

-(void)requestSomething:(NSString *)url
{
    NSString *queue_id = @"queue_identifier";
    dispatch_queue_t queue = dispatch_queue_create([queue_id UTF8String], 0);
    dispatch_queue_t main = dispatch_get_main_queue();

    dispatch_async(queue, ^{

        NSURLRequest   *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
        NSError        *serviceError = nil;
        NSURLResponse  *serviceResponse = nil;
        NSData *dataResponse = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&serviceResponse error:&serviceError];

        if(serviceError)
        {
            dispatch_sync(main, ^{

                // Do UI work like removing indicator or show user an alert with description of error using serviceError object.

                return;
            });
        }

        else
        {
            // Use dataResponse object and parse it as this part of code will not executed on main thread.

            dispatch_sync(main, ^{

                // Do UI work like updating table-view or labels using parsed data or removing indicator

            });
        }
    });

    // If your project is not developed under ARC mechanism, add following line
    dispatch_release(queue);
}