GCD其他常用函數(shù)12

知識(shí)點(diǎn)一

GCD中還有個(gè)用來執(zhí)行任務(wù)的函數(shù)

dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);

在前面的任務(wù)執(zhí)行幾位數(shù)后它才執(zhí)行息楔,而且它后面的任務(wù)等它執(zhí)行完成之后才會(huì)執(zhí)行

這個(gè)queue不能是全局的并發(fā)隊(duì)列

知識(shí)點(diǎn)二

延時(shí)執(zhí)行

iOS常見的延時(shí)執(zhí)行方法

1.調(diào)用NSObject方法

[self performSelector:@selector(run)? WithObject:nil afterDelay:2.0];

//2秒后再延遲self 的 run方法

2.使用GCD函數(shù)

dispatch_ater(dispatch_time(DISPATCH_TIME_NOW,(int64_t)(2.0 * NSEC_PER_SEC)),dispatch_get_main_queue(),^{

//2秒后再執(zhí)行這里的代碼

})

3.使用NSTimer

[NSTimer scheduledTimerWithTimerInterval:2.0 target:self selector:@selector(test) userInfo:nil repeats:NO];

知識(shí)點(diǎn)三

一次性代碼

使用dispatch_once函數(shù)能保證某段代碼在程序運(yùn)行過程中只執(zhí)行1次

static dispatch_once_t onceToken;

dispatch_once(&onceToken,^{

//只能執(zhí)行1次的代碼(這里面默認(rèn)是線程安全的)

NSLog(@"-------------run");

});

知識(shí)點(diǎn)四

快速迭代

使用dispatch_apply函數(shù)能進(jìn)行快速迭代遍歷

dispatch_apply(10,queue,^(size_t index){

//執(zhí)行10次代碼,index順序不確定

NSLog(@"---------------%ld--------%@",index,[NSThread currentThread]);

});

知識(shí)點(diǎn)五

隊(duì)列組

有這么種需求

首先,分別異步執(zhí)行2個(gè)耗時(shí)的操作

其次:等2個(gè)異步操作都執(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í)行1個(gè)耗時(shí)的異步操作

});

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

//執(zhí)行1個(gè)耗時(shí)的異步操作

});

dispatch_group_notify(group,dispatch_get_main_queue(),^{

//等前面的異步操作都執(zhí)行完畢后窿锉,回到主線程。澄阳。括授。倾哺。

});




代碼實(shí)現(xiàn)部分

//圖片1

@property (nonatomic, strong) UIImage *image1;

//圖片2

@property (nonatomic, strong) UIImage *image2;

@property(weak,nonatomic) IBOutlet UIImageView *imageView;

//異步函數(shù)要等整個(gè)函數(shù)執(zhí)行完了才執(zhí)行NSLog(@"-------轧邪?--------%@",[NSThread currentThread]);也就是NSLog(@"----------touchesBegan-------------");執(zhí)行完才打印NSLog(@"-------?--------%@",[NSThread currentThread]);

//同步函數(shù)立即執(zhí)行NSLog(@"-------羞海?--------%@",[NSThread currentThread]);

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

//[self barrier];

//[self delay];

//[self once];

//[self apply];

//[self group];

//dispatch_async(dispatch_queue_t queue,^(void)block);

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_PRIORITY_QUEUE,0);

dispatch_async_f(queue,NUll ,download);



}

void download(void *data){

}


- (void)group{

//1.下載圖片1

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

//創(chuàng)建一個(gè)隊(duì)列組

diapatch_group_t group? = dispatch_group_create();

dispatch_group_async(group?,^{

//圖片的網(wǎng)絡(luò)路徑

NSURL *url = [NSURL URLWithString:@"http://img-arch.pconline.com.cn/images/photoblog/9/9/8/1/9981681/200910/11/1255259355826.jpg"];

//加載圖片

NSData *data = [NSData dataWithContentsOfURL:url];

//生成圖片

sefl.image1 = [UIImage imageWithData:data];

});

//2.下載圖片2

dispatch_group? _async(group?,^{

//圖片的網(wǎng)絡(luò)路徑

NSURL *url = [USURL URLWithString:@http://pic38.nipic.com/20140228/5571398_215900721128_2.jpg"];

//加載圖片

NSData *data = [NSData dataWithContentsOfURL:url];

//生成圖片

sefl.image2 = [UIImage imageWithData:data];

});


//3.將圖片1却邓、圖片2合成一張新的圖片

//dispatch_barrier_async(queue,^{});//前面線程要自己創(chuàng)建線程,不用global線程

//將前面執(zhí)行完了腊徙,后面才執(zhí)行

dispatch_group_notify(group,queue,^{

//NSLog(@"%@ %@",self.image1,self.image2);

//開啟新的圖形上下文

UIGraphicsBeginImageContext(CGSizeMake(100,100));

//繪制圖片

[self.image1 drawInRect:CGRectMake(0,0,50,100)];

[self.image2 drawInRect:CGRectMake(50,0,50,100)];

//獲得上下文中的圖片

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

//結(jié)束上下文中的圖片

UIGraphicsEndImageContext();

//回到主線程顯示圖片

dispatch_async(dispatch_get_main_queue(), ^{

//4.將新圖片顯示出來

//在storyboard拖拽UIImageView 并且綁定屬性

self.imageView.image = image;

});


});



}

快速迭代

- (void)apply{

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

NSString *from = @"/Users/xiaomage/Desktop/From";//文件夾路徑

NSString *to?= @"/Users/xiaomage/Desktop/To";//另外個(gè)文件夾的路徑

NSFileManager *manager = [NSFileManager defaultManager];

NSArray *subpaths = [manager subpathsAtPath:from];

//快速迭代:同時(shí)執(zhí)行

//可以實(shí)現(xiàn)循環(huán)

dispatch_apply(10,queue,^(size_t index){

NSString *subpath = subpaths[index];

NSString *fromFullpath = [from stringByAppendingPathComponent:subpath];

NSString *toFullpath = [to stringByAppendingPathComponent:subpath];

//剪切

[manager moveItemAtPath:fromFullpath toPath:toFullpath error:nil];

NSLog(@====%@-----%@,subpath,[NSThread currentThread]);

});

}


保證代碼只執(zhí)行一次(整個(gè)程序運(yùn)行過程中只執(zhí)行一次,懶加載中不能使用dispatch_once)

- (void)once{

static dispatch_once_t onceToken;

dispatch_once(&onceToken,^{

NSLog(@"-------------run");

});

}

- (void)run{

NSLog(@"-----------------run");

}

//延遲執(zhí)行方法

- (void)delay{

NSLog(@"touchesBegan----------------");

//延遲的第一種方法

//[self performSelector:@selector(run) withObject:nil afterDelay:2.0];

//第二種方法

dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(int64_t)(2.0 * NSEC_PER_SEC)),dispatch_get_main_queue(),^{

NSLog(@"run------------");

});

//第三種方法

[NSTimer scheduledTimeWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:NO];

}

//阻礙執(zhí)行方法

- (void)barrier

{

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

dispatch_queue_t queue? = dispatch_queue_create("queue",DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue,^{

NSLog(@"-------1--------%@",[NSThread currentThread]);

});

dispatch_async(queue,^{

NSLog(@"-------2--------%@",[NSThread currentThread]);

});

//barrier的作用:barrier前的任務(wù)先執(zhí)行檬某,barrier后的任務(wù)后執(zhí)行

dispatch_barrier_async(queue,^{

NSLog(@"---------------barrier----------%@",[NSThread currentThread]);

});

dispatch_async(queue,^{

NSLog(@"-------3--------%@",[NSThread currentThread]);

});

}

NSLog(@"----------touchesBegan-------------");

}

//延時(shí)執(zhí)行


- (void)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末恢恼,一起剝皮案震驚了整個(gè)濱河市民傻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌场斑,老刑警劉巖漓踢,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漏隐,死亡現(xiàn)場離奇詭異,居然都是意外死亡青责,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門扁耐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浩村,“玉大人做葵,你說我怎么就攤上這事心墅。” “怎么了瘫筐?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵铐姚,是天一觀的道長肛捍。 經(jīng)常有香客問我之众,道長,這世上最難降的妖魔是什么棺禾? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任膘婶,我火速辦了婚禮,結(jié)果婚禮上悬襟,老公的妹妹穿的比我還像新娘衅码。我一直安慰自己,他們只是感情好逝段,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布逸绎。 她就那樣靜靜地躺著,像睡著了一般棺牧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上参淹,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天乏悄,我揣著相機(jī)與錄音,去河邊找鬼开呐。 笑死规求,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的阻肿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼较解,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了印衔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤届慈,失蹤者是張志新(化名)和其女友劉穎忿偷,沒想到半個(gè)月后臊泌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茶凳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年播揪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片箱沦。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡雇庙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寒跳,到底是詐尸還是另有隱情竹椒,我是刑警寧澤童太,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布书释,位于F島的核電站舶吗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏誓琼。R本人自食惡果不足惜肴捉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一叔收、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窃页,春花似錦、人聲如沸脖卖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽十籍。三九已至唇礁,卻和暖如春勾栗,著一層夾襖步出監(jiān)牢的瞬間盏筐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工楷拳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吏奸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓她混,卻偏偏與公主長得像泊碑,于是被迫代替她去往敵國和親坤按。 傳聞我的和親對(duì)象是個(gè)殘疾皇子馒过,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • NSThread 第一種:通過NSThread的對(duì)象方法 NSThread *thread = [[NSThrea...
    攻城獅GG閱讀 789評(píng)論 0 3
  • #import "ViewController.h" @interface ViewController () @...
    艾克12138閱讀 211評(píng)論 0 0
  • 年輕人领猾,會(huì)花錢還是會(huì)攢錢,哪一個(gè)更重要面粮? 在年輕人中继低,這應(yīng)該是一個(gè)普遍出現(xiàn)的疑惑但金。我們這一代的人總是被上一輩的人灌...
    72灘閱讀 383評(píng)論 0 0
  • Beer Opening Glass 讓您擺脫喝啤酒時(shí)到處找開瓶器的煩惱。鋼制底部帶有開瓶器钱磅,既能有保冷作用,又能...
    晶品TRIZ閱讀 393評(píng)論 0 0
  • 模式定義 定義一些列的算法年柠,吧他們一個(gè)個(gè)封裝起來褪迟,并且使他們克相互替換。本模式使得算法可獨(dú)立于使用它的客戶而變化味赃。...
    忘凈空閱讀 423評(píng)論 0 0