Swift
編程
Swift51.com
首頁
社區(qū)
▼
資訊
問答
分享
建議
開源代碼
Xcode下載
Swift教程
hot
登錄
注冊
當(dāng)前位置:
首頁
> 分享
歡迎加入QQ討論群258996829
蘋果6袋
6
麥子學(xué)院
多線程GCD有哪些常用的函數(shù)
發(fā)布時(shí)間:2016-06-18 22:46 回復(fù):0 查看:3114 最后回復(fù):2016-06-18 22:46
可能很多iOS小白對iOS多線程函數(shù)比較迷惑,別著急,這里給大家列舉了幾個最常用的
iOS多線程
函數(shù),希望對大家有所幫助。
線程間的通信
從子線程回到主線程
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//執(zhí)行耗時(shí)的異步操作
dispatch_async(dispatch_get_main_queue(), ^{
//回到主線程刷新UI
});
});
延時(shí)執(zhí)行
iOS常見的延時(shí)執(zhí)行有兩種方式
p 調(diào)用NSObject的方法
[self performSelector:@selector(run:) withObject:nil afterDelay:2.0];
p 使用GCD函數(shù)
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//2秒后異執(zhí)行這里的代碼
});
一次性代碼
使用dispatch_once函數(shù)能保證某段代碼在執(zhí)行過程中只被執(zhí)行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//只執(zhí)行一次的代碼(這里默認(rèn)是線程安全的)
});
dispatch_barrier_async (柵欄函數(shù))
dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);
dispatch_barrier_async的作用是在并行隊(duì)列中,插入其中,就會有等到其前面的線程執(zhí)行完畢,然后執(zhí)行自己的線程,再執(zhí)行其后面的線程。起到一個柵欄的作用
示例代碼
- (void)barrier
{
dispatch_queue_t queue = dispatch_queue_create("12312312", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSLog(@"----1-----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----2-----%@", [NSThread currentThread]);
});
dispatch_barrier_async(queue, ^{
NSLog(@"----barrier-----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----3-----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----4-----%@", [NSThread currentThread]);
});
}
dispatch_apply()
方法
void
dispatch_apply(size_t iterations, dispatch_queue_t queue,
void (^block)(size_t));
參數(shù)
iterations 執(zhí)行的次數(shù)
queue 提交到的隊(duì)列
block 執(zhí)行的任務(wù)
size_t 傳當(dāng)前索引
功能
p 把一項(xiàng)任務(wù)提交到隊(duì)列中多次執(zhí)行,具體是并行執(zhí)行還是串行執(zhí)行由隊(duì)列本身決定.注意,dispatch_apply不會立刻返回,在執(zhí)行完畢后才會返回,是同步的調(diào)用。
p 它可以起到快速迭代的作用,類似于for循環(huán)的遍歷,但for循環(huán)的遍歷是一個一個執(zhí)行的,而dispatch_apply是幾乎同時(shí)執(zhí)行的
示例代碼
/**
* 快速迭代
*/
- (void)apply
{
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
NSString *from = @"/Users/shenzhouguangda/Desktop/icon";
NSString *to = @"/Users/shenzhouguangda/Desktop/icon1";
NSFileManager *mgr = [NSFileManager defaultManager];
NSArray *subpaths = [mgr subpathsAtPath:from];
dispatch_apply(subpaths.count, queue, ^(size_t index) {
NSString *subpath = subpaths[index];
NSString *fromFullpath = [from stringByAppendingPathComponent:subpath];
NSString *toFullpath = [to stringByAppendingPathComponent:subpath];
// 剪切
[mgr moveItemAtPath:fromFullpath toPath:toFullpath error:nil];
NSLog(@"%@---%@", [NSThread currentThread], subpath);
});
}
隊(duì)列組
有這么一種需求
p 首先:分別異步執(zhí)行兩個耗時(shí)操作
p 其次:等兩個異步操作都執(zhí)行完畢后,再回到主線程執(zhí)行操作
如果想要快速高效的實(shí)現(xiàn)上述需求,可以考慮用隊(duì)列組
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//執(zhí)行一個耗時(shí)操作
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//執(zhí)行一個耗時(shí)操作
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
//等到前面的異步操作都執(zhí)行完畢后,回到主線程。
});
原文來自:簡書/一抹月光3053
取消引用
您還未登錄,
請先登錄
提 問
熱門帖子
iDev 全平臺開發(fā)者大會門票免費(fèi)送!限量10張!
蘋果Mac Pro垃圾桶 最低配的ME253CH
本人想買個蘋果電腦搞開發(fā),哪位大俠指點(diǎn)下
求助:failable initializer 'init(name:)' cannot override a non-failable initializer
為慶祝Swift發(fā)布1個月,雨燕社區(qū)正式上線。
在UITextFeild里輸入數(shù)據(jù),這個數(shù)據(jù)怎么做加減乘除?
Swift 高仿喜馬拉雅FM
要成為自由職業(yè)者?先要學(xué)會蘋果的Swift哦
用swift實(shí)現(xiàn)的調(diào)用系統(tǒng)相機(jī),相冊的DEMO
關(guān)于嵌入式引用\()
Swift 教程
最新帖子
swift_5.3可以更新了
swift如何實(shí)現(xiàn)左滑刪除
IBM Swift Sandbox訪問
Thread 18: Fatal error: 'try!' expression unexpectedly raised an error: Error
跟隨手勢滑動的ScrollableTextField
Swift5.0什么時(shí)候出
什么時(shí)候出5.0
PerfectTemplate 無法編譯
WWDC19 蘋果宣布全新 UI 框架 SwiftUI
水平滾動視圖Carousel
Xcode 9.4下載
?
Copyright © 2017 Swift 編程 版權(quán)所有
推動 Swift 成為最受歡迎的編程語言!
友鏈、商務(wù)合作:service??swift51.com
手機(jī)版