亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

IOS中級篇——多線程--NSOperation

2019-11-14 18:48:03
字體:
來源:轉載
供稿:網友
NSOperation 操作? 任務是對代碼的封裝, 操作是對任務的封裝 --目的:就是可以隨時的暫停/恢復/取消任務;

NSOperation
GCD的封裝. OC 運用起來更加方便. 抽象類.

NSOperation的使用:

<
1> 操作直接調用 start方法,就是在當前線程執行(Block中封裝的任務數大于1的情況除外).

<2> 就是將操作放在隊列中.自動的幫我們開啟線程,來執行操作.

兩個子類:

NSInvocationOperation:
調用
? ? ?
1. NSOperation兩個子類的使用:
?// 創建一個NSOpertation的子類 NSInvocationOperation
? ?? NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self ? ?? ?????selector:@selector(longTimeOperation) object:nil];
? ? ?[op1 start]; ?//調用 ?開始任務 ?
? ? ? 不會開啟線程。 ?在主線程中執行?
?NSBlockOperation:Block
? // 創建一個NSOpertation的子類 ?NSBlockOperation
??? NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
???????
// Block中封裝操作.
??????? [
self longTimeOperation];
??? }];
//?追加一個操作(任務).
??? [op2 addExecutionBlock:^{
??????? NSLog(@"下載圖片1:%@",[NSThread currentThread]);
??? }];
? // 追加一個操作(任務).
??? [op2 addExecutionBlock:^{
??????? NSLog(@"下載圖片2:%@",[NSThread currentThread]);
??? }];
// [op2 start];
?? // NSBlockOperation 直接調用start方法:
?? // 如果只有一個任務:在主線程中執行
?? // 如果有多個任務:會開啟多條線程,在主線程中和子線程中都執行任務.
?? // 多個任務都是同時執行的.

??? // 操作完成之后的回調(異步的回調)
???
// 一般用的不多.
??? op2.
completionBlock = ^{
???????
// 操作執行完畢的回調(什么時候操作執行完畢,我們并不知道)
???????
NSLog(@"操作1執行完畢%@",[NSThreadcurrentThread]);
??? };
? ?
?// 創建一個非隊列: ?非主隊列:非主隊列存放的操作都在子主線程中執行.
??? NSOperationQueue *queue = [[NSOperationQueue alloc] init];
?// 獲取一個主隊列 ??主隊列:主隊列存放的操作在主線程中執行
??? NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
?// 使用:將操作添加到隊列中
??? [queue? ?addOperation:op2];
??? [queue?addOperation:op1];
?// 將操作添加到隊列中,會自動(開啟線程)的異步執行操作.
? ? 任務增加到隊列中。 就調用Operation里的main方法。 ?然后自動執行任務? ? ?

任務依賴
? ? [op1 addDependency:op2]; ?//等任務 op2 執行完后 在執行op1
??? [op2 addDependency:op3]; ?//等任務 op3 執行完后 在執行op2
? ? ?這兩句的效果是: op3最先執行 在op2 執行 ?最后執行 op1
高級操作:
一般情況下 隊列都用懶加載的方法來實現
@PRoperty (nonatomic, strong) NSOperationQueue *queue;
? ? ? // 懶加載Queue
-(
NSOperationQueue *)queue
{
???
if (!_queue) {
???????
_queue = [[NSOperationQueuealloc] init];
???????
// 最大并發數為6 .
??????? [
_queuesetMaxConcurrentOperationCount:6];
??? }
???
return_queue;
}
在block中 用到self 都要用weak方式 ? 否則會造循環引用問題
_weaktypeof(self) wself = self;?
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
??????[wself longTimeOperation];
}];
? ? // 取消單個操作,一般也不用.
??? [op2 cancel];
??? // 暫停隊列中的操作
??? [self.queue setSuspended:YES];
??? // 恢復隊列中的操作
??? [self.queue setSuspended:NO];
??? // 取消所有操作,對于已經取消的操作,就永遠取消了,不會再次開啟
??? [self.queue cancelAllOperations];

// 自定義NSOperation; 線程間通訊
??? NSBlockOperation *op = [NSBlockOperationblockOperationWithBlock:^{
???????
// 執行的任務
???????????
UIImage *image = [selflongTimeOperation];
???????????
NSBlockOperation *op = [NSBlockOperationblockOperationWithBlock:^{
? ? ? ? ? ? ? self.imageView.image = image;
? ? ? ? ?? }];
? ? ? ? [[NSOperationQueue mainQueue] addOperation:op];
??? }];
下面都是自定義NSOperation方式
// 不同對象間的通訊
三種方式
? ? ? ?? 1.通知
1.>// 下載圖片完成的時候?發送一個通知,將圖片傳遞出去(通知中的參數是image) ?
[[NSNotificationCenter defaultCenter] postNotificationName:@"ITDownloadImageOperation" object:image];

2.>// 在需要用到內容的類 注冊通知的接收者.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(setUpImage:)?name:@"ITDownloadImageOperation" object:nil];
3.>// 通知傳遞的參數,永遠是一個NSNotification; ? 注冊通知時用到的方法
- (void)setUpImage:(NSNotification *)notify
{
??? // 回到主線程
??? dispatch_async(dispatch_get_main_queue(), ^{?
??????? NSLog(@"setUpImage%@",[NSThread currentThread]);
??????? // notify.object就是通知傳遞的對象.
??????? // 本次通知中,通知傳遞的對象就是這個操作
??????? ITDownloadImageOperation *op = notify.object;
??????? self.imageView.image = op.image;
??? });
}
? ? ?? 2.代理
? ? ? ? ? ? ? ?? ?參考以前代理的寫法 ? 一模一樣
? ? ?? 3.block
// 1.定義一個block類型 ?參數為image
typedefvoid (^downloadImageOperationBlock)(UIImage *image);
// 2.定義一個Block的屬性
@property (nonatomic, copy) downloadImageOperationBlock downBlock;
// 3. 設置Block中想要執行的內容;
// Block 只是一個塊代碼.Block中的內容什么時候執行,和定義其中的內容是分開進行的.
op.downBlock = ^(UIImage *image){
? ? // Block中想要執行的內容.
? ? self.imageView.image = image;
};
// 4. 在 main執行這個Block ?
-(void)main
{
??? @autoreleasepool {
// 在子線程下載圖片
??????? UIImage *image = [self downloadImage];
?// 回到主線程
??????? [[NSOperationQueue mainQueue] addOperationWithBlock:^{
if (self.downBlock) {
? ? ? self.downBlock(image);
? ? ? NSLog(@"執行Block中的內容: 設置圖片");
}
}];
}
}
3.block 方法形式 傳單個對象 如UIImage
前兩步 跟上面一樣
// 3.定義一個方法,負責傳遞Block
// (downloadImageOperationBlock)blk:Block當做一個參數來傳遞
- (void)setUpImageWithBlock:(downloadImageOperationBlock)blk;
// 4.實現這個方法,self.downBlock賦值
-(void)setUpImageWithBlock:(downloadImageOperationBlock)blk
{
??? if (blk) {
??????? // self.downBlock賦值(Block內部執行的方法)
??????? self.downBlock = blk;
??? }
}
? ? // 5.Block中的內容是一個參數
??? [op setUpImageWithBlock:^(UIImage *image) {
??????? // 定義一個Block中執行的內容.
??????? self.imageView.image = image;
??? }];
? ? ?????// 6.調用block ?與上面第4步一樣
?? 3.block 方法形式 傳本身類 ? ?
? ? ? ? ? ? ? ?? ? ?些方法跟 傳單個對象用法一模一樣 只是在調用bolck時傳self
? ? ? ? ? ? ? ? ? ??self.downBlock(image);
? ? ?? ? 在設置值的時候 用對象.某個對象
? ITDownloadOperationBlock *op = [[ITDownloadOperationBlockalloc] init];
? [op setUpImageWithBlock:^(ITDownloadOperationBlock *op) {
? ? ? self.imageView.image = op.image;
? }];? ? ?
? ?
?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情欧美激情| 国产精品偷伦视频免费观看国产| 成人写真福利网| 668精品在线视频| 亚洲精品一区二区网址| 这里只有精品视频在线| 欧美成人一区二区三区电影| 成人高清视频观看www| 亚洲精品98久久久久久中文字幕| 亚洲欧美国产视频| 久久久精品999| 欧美韩日一区二区| 国内外成人免费激情在线视频| 51色欧美片视频在线观看| 久久91超碰青草是什么| 在线观看日韩www视频免费| 一区二区亚洲精品国产| 亚洲综合中文字幕68页| 国产乱人伦真实精品视频| 亚洲成色777777在线观看影院| 91高清免费视频| 8050国产精品久久久久久| 欧美在线观看网址综合| 日韩av观看网址| 欧美日韩在线视频一区| 国产日韩欧美另类| 国产精品亚洲综合天堂夜夜| 最近更新的2019中文字幕| 尤物yw午夜国产精品视频明星| 欧美激情一区二区三区成人| 中文字幕日韩专区| 精品无人区乱码1区2区3区在线| 亚洲国产欧美一区二区三区同亚洲| 亚洲人av在线影院| 日韩欧美a级成人黄色| 亚洲综合自拍一区| 在线视频一区二区| 欧美韩日一区二区| 久久av中文字幕| 中文字幕日韩在线播放| 亚洲白拍色综合图区| 国产精品视频久| 国产91精品久久久久| 亚洲成av人影院在线观看| 136fldh精品导航福利| 8050国产精品久久久久久| 亚洲天堂网站在线观看视频| 亚洲欧美一区二区三区久久| 日韩视频免费大全中文字幕| 97在线免费视频| 成人激情av在线| 久久精品亚洲精品| 91国产精品视频在线| 韩国19禁主播vip福利视频| 色综合色综合网色综合| 成人国产精品久久久| 日韩二区三区在线| 亚洲国产天堂久久综合| 精品亚洲国产视频| 国产一级揄自揄精品视频| 国产成人97精品免费看片| 日韩激情av在线播放| 国产精品影院在线观看| 国产成人av在线| 国产精品久久久久久久久久久久| 日韩www在线| 欧美午夜片在线免费观看| 亚洲成人黄色网址| 久久视频在线观看免费| 日本精品性网站在线观看| 欧美床上激情在线观看| 日韩理论片久久| 国产精品久久久久福利| 97碰在线观看| 精品国产视频在线| 国产亚洲视频在线| 亚洲第一天堂av| 亚洲女人被黑人巨大进入al| 日韩中文字幕久久| 国产中文日韩欧美| 美女啪啪无遮挡免费久久网站| 久久久久久亚洲精品中文字幕| 久久免费国产视频| 91国产一区在线| 亚洲a成v人在线观看| 欧美大成色www永久网站婷| 国产精品视频在线观看| 一本色道久久88综合日韩精品| 大桥未久av一区二区三区| 久久久精品国产| 国产精品成人国产乱一区| 精品久久久久久久中文字幕| 亚洲国产婷婷香蕉久久久久久| 日韩成人在线视频| 欧美大片网站在线观看| 在线视频欧美日韩精品| 久久久久久久亚洲精品| 久久久久久久网站| 国产97在线视频| 青青在线视频一区二区三区| 97在线免费视频| 日韩性xxxx爱| 色播久久人人爽人人爽人人片视av| 日韩69视频在线观看| 久久九九热免费视频| 欧美日韩中文字幕| 北条麻妃在线一区二区| 精品视频久久久久久| 国产精品伦子伦免费视频| 亚洲一区二区三区乱码aⅴ蜜桃女| xxxxxxxxx欧美| 亚洲精品国产品国语在线| 亚洲精品日韩欧美| 国产精品va在线播放我和闺蜜| 伊人青青综合网站| 成人亚洲欧美一区二区三区| 亚洲视频在线免费看| 日韩av在线免费| 久久亚洲精品小早川怜子66| 日韩激情片免费| 亚洲成色999久久网站| 日韩视频中文字幕| 69av在线播放| 国产91九色视频| 精品综合久久久久久97| 俺去亚洲欧洲欧美日韩| 欧美日韩亚洲一区二区三区| 欧美性猛交丰臀xxxxx网站| 最近中文字幕日韩精品| 国产有码一区二区| 日韩精品福利网站| 国产欧美在线视频| 精品久久久国产| 亚洲丁香久久久| 在线观看国产精品淫| 亚洲最大福利视频网站| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲免费高清视频| 国产精品欧美日韩| 国产日韩欧美中文| 性欧美xxxx交| 久久综合五月天| 日韩精品视频在线免费观看| 欧美俄罗斯乱妇| 亚洲精品日韩在线| 欧美在线一级视频| 成人h猎奇视频网站| 欧美成人精品三级在线观看| 久久的精品视频| 欧洲亚洲免费视频| 国产精品久久久久国产a级| 草民午夜欧美限制a级福利片| 91在线免费网站| 成人中文字幕在线观看| 久久综合伊人77777| 精品av在线播放| 国产在线观看91精品一区| 91久久精品一区| 国产精品久久久久久久久男| 亚洲bt欧美bt日本bt| 亚洲黄色在线观看| 成人激情在线播放| 欧美在线播放视频| 91午夜在线播放|