在我的大部分采访中,我都被问及网络服务和多线程。我没有做过,所以我决定更多地了解 Web服务和使用Grand Central Dispatch进行多线程。
对于Web服务,我理解它的方式是您需要使用诸如NSURLConnection
之类的类来获取数据。基本上设置一个新的NSURL
,然后是一个连接,然后是一个请求。您还需要使用API的方法,例如didConnect
,didReceiveData
和didFailLoadWithError
。收到数据(通常为JSON或XML格式并存储为NSData对象)后,您可以存储它并通过它进行解析。有多种方法可以解析它,例如使用SBJSON或NSXMLParser。然后,您可以根据需要使用它。
对于多线程,Grand Central Dispatch是一种多线程的c风格方式。基本上,当你需要远离主线程进行大量拖运以避免应用程序冻结时,可以使用它。您可以同步或异步调度。异步意味着主线程上的方法将继续执行,同步意味着它不会。您永远不需要与NSURLConnection
一起使用GCD,因为NSURLConnection
已经在后台执行其工作,然后调用主线程中的委托。但是,对于保存和解压缩文件,您应该使用GCD。当您致电dispatch_async
时,您会传入一个调度队列。您可以使用串行队列或并发队列。串行队列将按照它们到达的顺序一次一个地执行队列中的任务。这是默认设置。对于并发队列,可以同时执行并发执行的任务。
我的第一个问题是,我对这两个概念有正确的理解吗?我知道有很多来了解GCD,但我只是想确保我的基本想法是正确的。另外,对于GCD,为什么有人想要同步发送,这不会破坏多线程的目的吗?
答案 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);
}