在iOS开发中利用GCD进行多线程编程

GCD = Grand Central Dispatch,是苹果开发中针对多线程编程的一个框架,在iOS4.0中引入。

>>>>>>>>iOS中的多线程有以下几个办法

1.performSelector(InBackground or MainThread)

这个方法比较方便,但是问题在于参数传递只能支持一个对象(传多个参数,我是将其打包在一个NSDictionary里面)

2.NSOperationQueue

这个方法稍微复杂,提供了每个任务的封装(NSOperation)。可以继承NSOperation之后,在main函数中写一些同步执行的代码,然后放到一个Queue之中,Queue自动管理Operation的执行和调度(在UI线程以外)。对于异步执行的代码,需要重载NSOperation的好几个函数才能正常工作(告诉Queue关于这个任务的进度以及执行情况)。

3.NSThread

这种方法我还没有研究过,不过直觉会比较复杂。

4.GCD

在UI线程和其它线程之间切换很方便,我喜欢的方式是和NSOperationQueue搭配使用。本文着重介绍这个方法。

>>>>>>>>GCD的使用方法

以点击一个按钮,然后显示loading,同时在后台下载一张图片,最后将下载的图片放到UIImageView中显示为例。

//显示loading

self.indicator.hidden=NO;

[self.indicator startAnimating];

//进入异步线程

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{

//异步下载图片

NSURL*url=[NSURLURLWithString:@“http://anImageUrl”];

NSData*data=[NSDatadataWithContentsOfURL:url];

//网络请求之后进入主线程

dispatch_async(dispatch_get_main_queue(),^{

//关闭loading

[self.indicator stopAnimating];

self.indicator.hidden=YES;

if(data){//显示图片

self.imageView.image=[UIImageimageWithData:data];

}

});

});

这样利用GCD可以把关于一个任务的代码都放在一起。而不是像采用第一种方法一样代码到处散落。

>>>>>>> 利用GCD延迟执行任务的方法

// 延迟2秒执行:

doubledelayInSeconds=2.0;

dispatch_time_tpopTime=dispatch_time(DISPATCH_TIME_NOW,delayInSeconds*NSEC_PER_SEC);

dispatch_after(popTime,dispatch_get_main_queue(),^(void){

// code to be executed on the main queue after delay

});

>>>>>>> 创建自己的Queue

dispatch_queue_tcustom_queue=dispatch_queue_create(“customQueue”,NULL);

dispatch_async(custom_queue,^{

//doing something in custom_queue

});

dispatch_release(custom_queue);

>>>>>>> 利用GCD并行多个线程并且等待所有线程结束之后再执行其它任务

dispatch_group_tgroup=dispatch_group_create();

dispatch_group_async(group,dispatch_get_global_queue(0,0),^{

// 并行执行的线程一

});

dispatch_group_async(group,dispatch_get_global_queue(0,0),^{

// 并行执行的线程二

});

dispatch_group_notify(group,dispatch_get_global_queue(0,0),^{

// 汇总结果

});

参考

http://blog.iosxcode4.com/archives/212

你可能感兴趣的:(在iOS开发中利用GCD进行多线程编程)