GCD的基本函數(shù):
- dispatch_sync() 同步執(zhí)行
- dispatch_async() 異步執(zhí)行
- dispatch_after() 延時(shí)執(zhí)行
- dispatch_once() 一次性執(zhí)行
- dispatch_apply() 提交隊(duì)列
- dispatch_queue_create() 創(chuàng)建隊(duì)列
- dispatch_group_create() 創(chuàng)建隊(duì)列組
- dispatch_group_async() 提交任務(wù)到隊(duì)列組
- dispatch_group_enter() / dispatch_group_leave() 將隊(duì)列組中的任務(wù)未執(zhí)行完畢的任務(wù)數(shù)目加減1(兩個(gè)函數(shù)要配合使用)
- dispatch_group_notify() 監(jiān)聽(tīng)隊(duì)列組執(zhí)行完畢
- dispatch_group_wait() 設(shè)置等待時(shí)間(返回 0成功,1失敗)
隊(duì)列:
GCD 用dispatch queue來(lái)處理代碼塊只磷,這些隊(duì)列管理你提供給 GCD 的任務(wù)并執(zhí)行這些任務(wù)钮追。這就保證了第一個(gè)被添加到隊(duì)列里的任務(wù)會(huì)是隊(duì)列中第一個(gè)開(kāi)始的任務(wù),而第二個(gè)被添加的任務(wù)將第二個(gè)開(kāi)始轧叽,如此直到隊(duì)列的終點(diǎn)惠毁。
- 主隊(duì)列:系統(tǒng)提供的一個(gè)特殊隊(duì)列鞠绰。和其它串行隊(duì)列一樣,這個(gè)隊(duì)列中的任務(wù)一次只能執(zhí)行一個(gè)屿笼。它能保證所有的任務(wù)都在主線程執(zhí)行驴一,而主線程是唯一可用于更新 UI 的線程。這個(gè)隊(duì)列就是用來(lái)在主線程上進(jìn)行操作的杈曲。
- 串行隊(duì)列:串行隊(duì)列中的任務(wù)一次執(zhí)行一個(gè)担扑,每個(gè)任務(wù)只會(huì)在上一個(gè)任務(wù)完成時(shí)才開(kāi)始執(zhí)行趣钱。
- 并發(fā)隊(duì)列:在并發(fā)隊(duì)列中的任務(wù)會(huì)按照被添加的順序開(kāi)始執(zhí)行首有,任務(wù)可能以任意順序完成,你不能知道什么時(shí)開(kāi)始執(zhí)行下一個(gè)任務(wù)卜壕,或者有多少任務(wù)在同時(shí)執(zhí)行低矮。
//獲取主隊(duì)列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//使用dispatch_get_global_queue()獲取全局并發(fā)隊(duì)列,第一個(gè)參數(shù)是隊(duì)列優(yōu)先級(jí),第二個(gè)參數(shù)傳0.
dispatch_queue_t otherQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
/**
* 使用 dispatch_queue_create 初始化 concurrentQueue 為一個(gè)并發(fā)隊(duì)列军掂。
* 第一個(gè)參數(shù)是隊(duì)列標(biāo)識(shí)蝗锥;第二個(gè)參數(shù)指定你的隊(duì)列是串行還是并發(fā)率触。設(shè)為NULL時(shí)默認(rèn)是DISPATCH_QUEUE_SERIAL葱蝗,將創(chuàng)建串行隊(duì)列.
* 在必要情況下,你可以將其設(shè)置為DISPATCH_QUEUE_CONCURRENT來(lái)創(chuàng)建自定義并行隊(duì)列.
*/
dispatch_queue_t myQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
同步和異步:
//同步函數(shù),在當(dāng)前線程執(zhí)行(不開(kāi)啟新的線程)
dispatch_sync(otherQueue, ^{
NSLog(@"同步:%@",[NSThread currentThread]);
});
//異步函數(shù),開(kāi)啟子線程執(zhí)行
dispatch_async(otherQueue, ^{
NSLog(@"異步:%@",[NSThread currentThread]);
});
打印:
[15276:540462] 同步:<NSThread: 0x600000068680>{number = 1, name = main}
[15276:540519] 異步:<NSThread: 0x600000074a80>{number = 3, name = (null)}
串行隊(duì)列:
一個(gè)任務(wù)執(zhí)行完畢后皂甘,再執(zhí)行下一個(gè)任務(wù)
- 異步
// 1.使用 dispatch_queue_creat()創(chuàng)建串行隊(duì)列
dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", NULL);
//開(kāi)啟新線程,串行執(zhí)行任務(wù)
NSLog(@"異步函數(shù)執(zhí)行串行隊(duì)列,當(dāng)前線程:%@",[NSThread currentThread]);
dispatch_async(serialQueue, ^{
NSLog(@"任務(wù)1:%@",[NSThread currentThread]);
});
dispatch_async(serialQueue, ^{
NSLog(@"任務(wù)2:%@",[NSThread currentThread]);
});
dispatch_async(serialQueue, ^{
NSLog(@"任務(wù)3:%@",[NSThread currentThread]);
});
- 同步
//不開(kāi)啟新線程,串行執(zhí)行任務(wù)
NSLog(@"同步函數(shù)執(zhí)行串行隊(duì)列,當(dāng)前線程:%@",[NSThread currentThread]);
dispatch_sync(serialQueue, ^{
NSLog(@"任務(wù)1:%@",[NSThread currentThread]);
});
dispatch_sync(serialQueue, ^{
NSLog(@"任務(wù)2:%@",[NSThread currentThread]);
});
dispatch_sync(serialQueue, ^{
NSLog(@"任務(wù)3:%@",[NSThread currentThread]);
});
并發(fā)隊(duì)列:
- 多個(gè)任務(wù)并發(fā)執(zhí)行(自動(dòng)開(kāi)啟多個(gè)線程同時(shí)執(zhí)行任務(wù))
- 并發(fā)功能只有在異步(dispatch_async)函數(shù)下才有效!
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//異步函數(shù),并發(fā)隊(duì)列
//開(kāi)啟新線程,并發(fā)執(zhí)行任務(wù)
NSLog(@"異步函數(shù)執(zhí)行并發(fā)隊(duì)列,當(dāng)前線程:%@",[NSThread currentThread]);
dispatch_async(concurrentQueue, ^{
NSLog(@"任務(wù)1:%@",[NSThread currentThread]);
});
dispatch_async(concurrentQueue, ^{
NSLog(@"任務(wù)2:%@",[NSThread currentThread]);
});
dispatch_async(concurrentQueue, ^{
NSLog(@"任務(wù)3:%@",[NSThread currentThread]);
});
隊(duì)列組:
任務(wù)1,任務(wù)2同時(shí)執(zhí)行,所有任務(wù)都執(zhí)行成功后回到主線程,高效率
NSLog(@"隊(duì)列組執(zhí)行任務(wù),當(dāng)前線程:%@",[NSThread currentThread]);
//1.創(chuàng)建隊(duì)列組 dispatch_group_create()
dispatch_group_t group = dispatch_group_create();
//2.開(kāi)啟任務(wù)
//開(kāi)啟任務(wù)1
//提交任務(wù)到隊(duì)列組 dispatch_group_async()
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i = 0; i < 5; i++) {
NSLog(@"任務(wù)1 :%@",[NSThread currentThread]);
}
});
//開(kāi)啟任務(wù)2
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i = 0; i < 5; i++) {
NSLog(@"任務(wù)2 :%@",[NSThread currentThread]);
}
});
//所有任務(wù)執(zhí)行完畢,回到主線程進(jìn)行操作
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"任務(wù)1,2執(zhí)行完畢,回到主線程:%@",[NSThread currentThread]);
});
延時(shí)執(zhí)行:
延遲一段時(shí)間把一項(xiàng)任務(wù)提交到隊(duì)列中執(zhí)行,返回之后就不能取消嗤锉,常用來(lái)在主隊(duì)列上延遲執(zhí)行一項(xiàng)任務(wù)墓塌。
NSLog(@"當(dāng)前線程 %@", [NSThread currentThread]);
//GCD延時(shí)調(diào)用(主線程)(主隊(duì)列)
/**
* 1.聲明一個(gè)變量 afterTime 指定要延遲的時(shí)長(zhǎng)
* 2.等待 afterTime 給定的時(shí)長(zhǎng)苫幢,再異步地添加一個(gè) Block 到主線程。
*/
dispatch_time_t afterTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC));//1
dispatch_after(afterTime, dispatch_get_main_queue(), ^{//2
NSLog(@"GCD延時(shí)調(diào)用(主線程):%@",[NSThread currentThread]);
});
//GCD延時(shí)調(diào)用(其他線程)(全局并發(fā)隊(duì)列)
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"GCD延時(shí)調(diào)用(其他線程):%@",[NSThread currentThread]);
});
打印:
[15276:540462] 當(dāng)前線程 <NSThread: 0x600000068680>{number = 1, name = main}
[15276:540462] GCD延時(shí)調(diào)用(主線程):<NSThread: 0x600000068680>{number = 1, name = main}
[15276:540521] GCD延時(shí)調(diào)用(其他線程):<NSThread: 0x60800007c940>{number = 4, name = (null)}
dispatch_once()
在整個(gè)程序運(yùn)行中,代碼會(huì)以線程安全的方式執(zhí)行并且只執(zhí)行一次
for (int i = 0 ; i < 99999; i++) {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"執(zhí)行一次:%d",i);
});
}
dispatch_barrier_async()
讀者寫者鎖(柵欄函數(shù))
- 在進(jìn)程管理中起到一個(gè)柵欄的作用,它等待所有位于barrier函數(shù)之前的操作執(zhí)行完畢后執(zhí)行
- 在barrier函數(shù)執(zhí)行之后,barrier函數(shù)之后的操作才會(huì)得到執(zhí)行
作用:
1.實(shí)現(xiàn)高效率的數(shù)據(jù)庫(kù)訪問(wèn)和文件訪問(wèn)
2.避免數(shù)據(jù)競(jìng)爭(zhēng)
使用:
dispatch_queue_t queue = dispatch_queue_create("barrier", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSLog(@"任務(wù)1:%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"任務(wù)2:%@",[NSThread currentThread]);
});
dispatch_barrier_async(queue, ^{
NSLog(@"---barrier---:%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"任務(wù)3:%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"任務(wù)4:%@",[NSThread currentThread]);
});
解決多個(gè)網(wǎng)絡(luò)請(qǐng)求全部發(fā)送后再進(jìn)行操作的問(wèn)題方案:
1.Dispatch Group
對(duì)多個(gè)異步任務(wù)的完成進(jìn)行監(jiān)控
代碼中的注釋:
- 創(chuàng)建一個(gè)新的 Dispatch Group,它相當(dāng)于一個(gè)用來(lái)記錄未完成任務(wù)的計(jì)數(shù)器玫氢。
- dispatch_group_enter,手動(dòng)通知 Dispatch Group 任務(wù)已經(jīng)開(kāi)始
- dispatch_group_leave,手動(dòng)通知 Dispatch Group 任務(wù)已經(jīng)完成
- dispatch_group_notify,當(dāng) Dispatch Group 中沒(méi)有任何任務(wù)時(shí)會(huì)執(zhí)行漾峡。
注意:
- 必須保證 dispatch_group_enter 和 dispatch_group_leave 成對(duì)出現(xiàn)喻旷,確保進(jìn)入 Group 的次數(shù)和離開(kāi) Group 的次數(shù)相等且预。
- (IBAction)requestForData:(id)sender
{
__block NSMutableDictionary *errDict = [NSMutableDictionary dictionaryWithCapacity:0];
__block NSMutableDictionary *successDic = [NSMutableDictionary dictionaryWithCapacity:0];
dispatch_group_t requestGroup = dispatch_group_create();//1
for(NSInteger i=1 ; i<4 ;i++)
{
dispatch_group_enter(requestGroup);//2
[self requestForDataWithIndex:i block:^(NSArray *dataArray, NSInteger index, BOOL isSuccess) {
if (isSuccess) {
NSLog(@"第%ld個(gè)網(wǎng)絡(luò)請(qǐng)求成功锋谐,返回參數(shù)是:%@",(long)index,dataArray);
[successDic setObject:dataArray forKey:[NSNumber numberWithInteger:index]];
}else{
NSLog(@"第%ld個(gè)網(wǎng)絡(luò)請(qǐng)求失敗,返回參數(shù)是:%@",(long)index,dataArray);
[errDict setObject:dataArray forKey:[NSNumber numberWithInteger:index]];
}
dispatch_group_leave(requestGroup);//3
}];
}
dispatch_group_notify(requestGroup, dispatch_get_main_queue(), ^{//4
//請(qǐng)求完成乾戏,主線程操作
NSLog(@"請(qǐng)求全部完成鼓择,成功數(shù)據(jù):%@,失敗數(shù)據(jù):%@",successDic,errDict);
});
}
打印
2017-03-21 14:11:42.098 GCD-Demo[15276:540462] 發(fā)起第1個(gè)網(wǎng)絡(luò)請(qǐng)求:<NSThread: 0x600000068680>{number = 1, name = main}
2017-03-21 14:11:42.098 GCD-Demo[15276:540462] 發(fā)起第2個(gè)網(wǎng)絡(luò)請(qǐng)求:<NSThread: 0x600000068680>{number = 1, name = main}
2017-03-21 14:11:42.099 GCD-Demo[15276:540462] 發(fā)起第3個(gè)網(wǎng)絡(luò)請(qǐng)求:<NSThread: 0x600000068680>{number = 1, name = main}
2017-03-21 14:11:43.190 GCD-Demo[15276:540462] 第1個(gè)網(wǎng)絡(luò)請(qǐng)求成功就漾,返回參數(shù)是:(
1
)
2017-03-21 14:11:43.599 GCD-Demo[15276:540462] 第3個(gè)網(wǎng)絡(luò)請(qǐng)求成功从藤,返回參數(shù)是:(
1
)
2017-03-21 14:11:44.599 GCD-Demo[15276:540462] 第2個(gè)網(wǎng)絡(luò)請(qǐng)求失敗锁蠕,返回參數(shù)是:(
0
)
2017-03-21 14:11:44.599 GCD-Demo[15276:540462] 請(qǐng)求全部完成荣倾,成功數(shù)據(jù):{
3 = (
1
);
1 = (
1
);
},失敗數(shù)據(jù):{
2 = (
0
);
}
2.dispatch_apply()
提交隊(duì)列,適用于并發(fā)循環(huán).
- (IBAction)requestForData_Dispatch_apply:(id)sender
{
/**
dispatch_apply()
@param iterations 迭代的次數(shù)
@param queue 指定任務(wù)運(yùn)行的隊(duì)列
@param size_t Block
*/
// dispatch_apply(size_t iterations, dispatch_queue_t _Nonnull queue, ^(size_t) {})
__block NSMutableDictionary *errDict = [NSMutableDictionary dictionaryWithCapacity:0];
__block NSMutableDictionary *successDic = [NSMutableDictionary dictionaryWithCapacity:0];
dispatch_group_t requestGroup = dispatch_group_create();
dispatch_apply(3, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t i) {
dispatch_group_enter(requestGroup);
[self requestForDataWithIndex:i block:^(NSArray *dataArray, NSInteger index, BOOL isSuccess) {
if (isSuccess) {
NSLog(@"第%ld個(gè)網(wǎng)絡(luò)請(qǐng)求成功舌仍,返回參數(shù)是:%@",(long)index,dataArray);
[successDic setObject:dataArray forKey:[NSNumber numberWithInteger:index]];
}
else
{
NSLog(@"第%ld個(gè)網(wǎng)絡(luò)請(qǐng)求失敗铸豁,返回參數(shù)是:%@",(long)index,dataArray);
[errDict setObject:dataArray forKey:[NSNumber numberWithInteger:index]];
}
dispatch_group_leave(requestGroup);
}];
});
dispatch_group_notify(requestGroup, dispatch_get_main_queue(), ^{
//請(qǐng)求完成菊碟,主線程操作
NSLog(@"請(qǐng)求全部完成,成功數(shù)據(jù):%@,失敗數(shù)據(jù):%@",successDic,errDict);
})
}
打印
2017-03-21 14:15:36.897 GCD-Demo[15276:540462] 發(fā)起第0個(gè)網(wǎng)絡(luò)請(qǐng)求:<NSThread: 0x600000068680>{number = 1, name = main}
2017-03-21 14:15:36.897 GCD-Demo[15276:540521] 發(fā)起第1個(gè)網(wǎng)絡(luò)請(qǐng)求:<NSThread: 0x60800007c940>{number = 4, name = (null)}
2017-03-21 14:15:36.897 GCD-Demo[15276:612863] 發(fā)起第2個(gè)網(wǎng)絡(luò)請(qǐng)求:<NSThread: 0x600000260400>{number = 5, name = (null)}
2017-03-21 14:15:37.993 GCD-Demo[15276:540462] 第1個(gè)網(wǎng)絡(luò)請(qǐng)求成功,返回參數(shù)是:(
1
)
2017-03-21 14:15:38.897 GCD-Demo[15276:540462] 第0個(gè)網(wǎng)絡(luò)請(qǐng)求成功魄幕,返回參數(shù)是:(
1
)
2017-03-21 14:15:39.398 GCD-Demo[15276:540462] 第2個(gè)網(wǎng)絡(luò)請(qǐng)求失敗纯陨,返回參數(shù)是:(
0
)
2017-03-21 14:15:39.398 GCD-Demo[15276:540462] 請(qǐng)求全部完成,成功數(shù)據(jù):{
0 = (
1
);
1 = (
1
);
},失敗數(shù)據(jù):{
2 = (
0
);
}
3.Dispatch Semaphore 信號(hào)量
- 信號(hào)量為0時(shí) 會(huì)阻塞線程咙轩,一直等待
- dispatch_semaphore_wait(信號(hào)量,等待時(shí)間) 這個(gè)函數(shù)會(huì)使傳入的信號(hào)量的值-1;
- dispatch_semaphore_signal (信號(hào)量) 這個(gè)函數(shù)會(huì)使傳入的信號(hào)量的值+1;
- 正常的使用順序是先降低然后再提高臭墨,這兩個(gè)函數(shù)通常成對(duì)使用膘盖。
信號(hào)量的理解:
- 信號(hào)量相當(dāng)于一個(gè)停車場(chǎng),創(chuàng)建時(shí)的參數(shù)相當(dāng)于提供多少個(gè)車位,如果你有兩個(gè)車位,有4輛車要停,那么,只能讓先進(jìn)來(lái)的兩個(gè)車子停下,后面的兩個(gè)車子等待,開(kāi)走一個(gè),才能停入下一個(gè).dispatch_semaphore_wait函數(shù)就相當(dāng)于來(lái)了一輛車,調(diào)用一次,車位就-1.dispatch_semaphore_signal函數(shù)相當(dāng)于走了一輛車,調(diào)用一次,車位就+1.
- (IBAction)requestForData_Dispatch_semaphore_t:(id)sender
{
__block NSMutableDictionary *errDict = [NSMutableDictionary dictionaryWithCapacity:0];
__block NSMutableDictionary *successDic = [NSMutableDictionary dictionaryWithCapacity:0];
//創(chuàng)建一個(gè)信號(hào)量侠畔。參數(shù)指定信號(hào)量的起始值(必須大于0)
dispatch_semaphore_t semaphore = dispatch_semaphore_create(2);
for (NSInteger i=0; i<4; i++) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);//信號(hào)量-1
[self requestForDataWithIndex:i block:^(NSArray *dataArray, NSInteger index, BOOL isSuccess) {
if (isSuccess) {
NSLog(@"第%ld個(gè)網(wǎng)絡(luò)請(qǐng)求成功软棺,返回參數(shù)是:%@",(long)index,dataArray);
[successDic setObject:dataArray forKey:[NSNumber numberWithInteger:index]];
}
else
{
NSLog(@"第%ld個(gè)網(wǎng)絡(luò)請(qǐng)求失敗尤勋,返回參數(shù)是:%@",(long)index,dataArray);
[errDict setObject:dataArray forKey:[NSNumber numberWithInteger:index]];
}
dispatch_semaphore_signal(semaphore);//信號(hào)量+1
}];
});
}
}
打印:
這里我代碼中設(shè)置信號(hào)量的起始值為2 ,就會(huì)同時(shí)發(fā)起0和1兩個(gè)任務(wù).0任務(wù)耗時(shí)長(zhǎng),1任務(wù)先返回后立即發(fā)起了任務(wù)2,0任務(wù)結(jié)束后立即發(fā)起了任務(wù)3.
2017-03-21 14:18:11.150 GCD-Demo[15276:613982] 發(fā)起第0個(gè)網(wǎng)絡(luò)請(qǐng)求:<NSThread: 0x60800007fe80>{number = 6, name = (null)}
2017-03-21 14:18:11.150 GCD-Demo[15276:612860] 發(fā)起第1個(gè)網(wǎng)絡(luò)請(qǐng)求:<NSThread: 0x608000064280>{number = 7, name = (null)}
2017-03-21 14:18:12.249 GCD-Demo[15276:540462] 第1個(gè)網(wǎng)絡(luò)請(qǐng)求成功,返回參數(shù)是:(
1
)
2017-03-21 14:18:12.249 GCD-Demo[15276:613984] 發(fā)起第2個(gè)網(wǎng)絡(luò)請(qǐng)求:<NSThread: 0x600000078880>{number = 8, name = (null)}
2017-03-21 14:18:13.151 GCD-Demo[15276:540462] 第0個(gè)網(wǎng)絡(luò)請(qǐng)求成功稀火,返回參數(shù)是:(
1
)
2017-03-21 14:18:13.151 GCD-Demo[15276:613985] 發(fā)起第3個(gè)網(wǎng)絡(luò)請(qǐng)求:<NSThread: 0x600000077380>{number = 9, name = (null)}
2017-03-21 14:18:14.652 GCD-Demo[15276:540462] 第3個(gè)網(wǎng)絡(luò)請(qǐng)求成功凰狞,返回參數(shù)是:(
1
)
2017-03-21 14:18:14.749 GCD-Demo[15276:540462] 第2個(gè)網(wǎng)絡(luò)請(qǐng)求失敗沛慢,返回參數(shù)是:(
0
)
- 注: 這里只是為了理解信號(hào)量而提供的一種思路...看看就好,不要抬杠...
最后,附上我用來(lái)模擬網(wǎng)絡(luò)請(qǐng)求的代碼:
//模擬網(wǎng)絡(luò)請(qǐng)求
- (void)requestForDataWithIndex:(NSInteger)index block:(Complete)callback
{
NSLog(@"發(fā)起第%ld個(gè)網(wǎng)絡(luò)請(qǐng)求:%@",(long)index,[NSThread currentThread]);
NSArray * successArray = [NSArray arrayWithObjects:@1, nil];
NSArray * failureArray = [NSArray arrayWithObjects:@0, nil];
if (index == 0) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if (callback) {
callback(successArray,index,YES);
}
});
}
else if (index == 1) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if (callback) {
callback(successArray,index,YES);
}
});
}
else if (index == 2)
{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if (callback) {
callback(failureArray,index,NO);
}
});
}
else if (index == 3)
{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if (callback) {
callback(successArray,index,YES);
}
});
}
}
另附上demo鏈接
Demo在這里下載...
路漫漫其修遠(yuǎn)兮...