IOS多線程_GCD的簡單使用和詳細說明 – iPhone手機開發技術文章 iPhone軟體開發教學課程

//你可以先看看這個例子的效果找點感覺,再看說明

@interface
yxpGCDVController ()

{

UIImageView *_imageView;

}

@end

@implementation yxpGCDVController

– (void)viewDidLoad

{

[super
viewDidLoad];

self.title=@”GCD”;

//初始化一_ImageView

_imageView=[[UIImageView
alloc] initWithFrame:CGRectMake(10,
70,
300, 450)];

_imageView.backgroundColor=[UIColor
grayColor];

_imageView.animationDuration=3.0;

_imageView.animationRepeatCount=0;

[self.view
addSubview:_imageView];

//在後臺異步執行隊列

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0), ^{

NSString *url1=@”/wp-content/images1/20181019/91ef76c6a7efce1b1ae9f92fad51f3deb58f6510149.gif”;

NSString *url2=@”/wp-content/images1/20181019/d058ccbf6c81800aae834e8bb33533fa838b47d5150.gif”;

NSString *url3=@”/wp-content/images1/20181019/f2deb48f8c5494eec3ba65132ff5e0fe99257e1b151.gif”;

NSString *url4=@”/wp-content/images1/20181019/a6efce1b9d16fdfa81f4ace4b68f8c5494ee7b1b152.gif”;

NSString *url5=@”/wp-content/images1/20181019/d6ca7bcb0a46f21f70031fdbf4246b600c33ae07153.gif”;

NSArray *array=[[NSArray
alloc] initWithObjects:url1,url2,url3,url4,url5,
nil];

NSMutableArray *imageArray=[[NSMutableArray
alloc] initWithCapacity:20];

for (NSString *string
in array) {

//下載圖片

NSLog(@”執行圖片下載函數”);

NSData *data = [NSData
dataWithContentsOfURL:[NSURL
URLWithString:string]];

UIImage *image = [UIImage
imageWithData:data];

[imageArray
addObject:image];

}

_imageView.animationImages=imageArray;

//回到主線程執行方法

dispatch_async(dispatch_get_main_queue(), ^{

[_imageView
startAnimating];

});

});

}

@end

//GCD 的使用方式

dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

async表明運行方式

queue則是你把任務交給那個線程隊列來處理

block代表的是你要做的事情

//線程運行方式

dispatch_async 異步執行

dispatch_sync 同步執行

dispatch_delay 延遲執行

//處理任務對象 dispatch queue(線程隊列)

一、dispatch_get_main_queue 主線程隊列(UI線程隊列)

二、dispatch_get_global_queue 並行線程隊列,由系統創建三個不同優先級的dispatch queue。並行隊列的執行順序與其加入隊列的順序相同。

三、串行隊列,一般用於按順序同步訪問,依次執行(順序由代碼先後覺得),可創建任意數量的串行隊列,各個串行隊列之間是並發的。

當想要任務按照某一個特定的順序執行時,串行隊列是很有用的。串行隊列在同一個時間隻執行一個任務。我們可以使用串行隊列代替鎖去保護共享的數據。和鎖不同,一個串行隊列可以保證任務在一個可預知的順序下執行。

串行隊列通過dispatch_queue_create創建,可以使用函數dispatch_retain和dispatch_release去增加或者減少引用計數。

//dispatch queue叫線程隊列

dispatch_queue_create 用於創建用戶線程隊列。可以創建Serial/Concurrent Dispatch Queue 兩種隊列,即串行與並行隊列。

一、創建Serial Dispatch Queue。

dispatch_queue_t serialQueue =dispatch_queue_create(“com.SerialQueue”,
NULL);

可以創建多個串行隊列,串行隊列也可以並行執行。決不能隨意的大量生產Serial Dispatch Queue。

二、創建Concurrent Dispatch Queue

dispatch_queue_t concurrentQueue =dispatch_queue_create(“com.ConcurrentQueue”,

DISPATCH_QUEUE_CONCURRENT);

Concurrent Dispatch Queue不過創建多少都沒有問題,因為Concurrent Dispatch Queue所使用的線程由系統的XNU內核高效管理,不會影響系統性能。

// 隻執行一次的線程 一般用來寫單例模式

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

});

EG:

static
SubObject *subobject =
nil;

+ (SubObject *)sharedRequest

{

static
dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

subobject = [[SubObject
alloc]init];

});

return
subobject;

}

// 延遲2秒執行線程

double delayInSeconds =
2.0;

dispatch_time_t popTime =
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

});

//線程匯總通知,等所有子線程(這個稱呼不準確,先代替瞭)執行完成後,才執行notify線程

dispatch_group_t group =
dispatch_group_create();

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

// 並行執行的線程一

for (int i=0; i<10; i++) {

NSLog(@”———%i”,i);

}

});

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

// 並行執行的線程二

for (int i=10; i<20; i++) {

NSLog(@”+++++++++%i”,i);

}

});

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

// 匯總結果

NSLog(@”完成”);

});

發佈留言