一、nsoperation簡介
1.簡單說明
nsoperation的作⽤:配合使用nsoperation和nsoperationqueue也能實現多執行緒程式設計
nsoperation和nsoperationqueue實現多執行緒的具體步驟:
(1)先將需要執行的操作封裝到乙個nsoperation物件中
(2)然後將nsoperation物件新增到nsoperationqueue中
(3)系統會⾃動將nsoperationqueue中的nsoperation取出來
(4)將取出的nsoperation封裝的操作放到⼀條新執行緒中執⾏
2.nsoperation的子類
nsoperation是個抽象類,並不具備封裝操作的能力,必須使⽤它的子類
使用nsoperation⼦類的方式有3種:
(1)nsinvocationoperation
(2)nsblockoperation
(3)自定義子類繼承nsoperation,實現內部相應的⽅法
二、 具體說明
1.nsinvocationoperation子類
建立物件和執行操作:
//建立操作物件,封裝要執行的任務
//nsinvocationoperation 封裝操作
nsinvocationoperation *operation=[[nsinvocationoperation alloc]initwithtarget:self selector:@selector(run) object:nil];
//執行操作
[operation start];
說明:一旦執⾏操作,就會呼叫target的run方法
**示例:
#import "viewcontroller.h"
@inte***ce viewcontroller ()
@end
@implementation viewcontroller
- (void)viewdidload
- (void)run
@end
列印檢視:
注意:操作物件預設在主線程中執行,只有新增到佇列中才會開啟新的執行緒。即預設情況下,如果操作沒有放到佇列中queue中,都是同步執行。只有將nsoperation放到乙個nsoperationqueue中,才會非同步執行操作
2.nsblockoperation子類
建立物件和新增操作:
//建立nsblockoperation操作物件
nsblockoperation *operation=[nsblockoperation blockoperationwithblock:^];
//新增操作
[operation addexecutionblock:^];
**示例:
**1:
#import "viewcontroller.h"
@inte***ce viewcontroller ()
@end
@implementation viewcontroller
- (void)viewdidload ];
// 啟動執行操作
[operation start];
}@end
列印檢視:
**2:
#import "viewcontroller.h"
@inte***ce viewcontroller ()
@end
@implementation viewcontroller
- (void)viewdidload ];
// 新增操作
[operation addexecutionblock:^];
[operation addexecutionblock:^];
// 啟動執行操作
[operation start];
}@end
注意:只要nsblockoperation封裝的運算元 > 1,就會非同步執行操作
3.nsoperationqueue
nsoperationqueue的作⽤:nsoperation可以調⽤start⽅法來執⾏任務,但預設是同步執行的
如果將nsoperation新增到nsoperationqueue(操作佇列)中,系統會自動非同步執行nsoperation中的操作
新增操作到nsoperationqueue中,自動執行操作,自動開啟執行緒
// 建立nsoperationqueue
nsoperationqueue *queue = [[nsoperationqueue alloc] init];
// 把操作新增到佇列中
// 第一種方式
[queue addoperation:operation1];
[queue addoperation:operation2];
[queue addoperation:operation3];
// 第二種方式
[queue addoperationwithblock:^];
- (void)addoperation:(nsoperation *)operation;
- (void)addoperationwithblock:(void (^)(void))block;
**示例:
#import "viewcontroller.h"
@inte***ce viewcontroller ()
@end
@implementation viewcontroller
- (void)viewdidload ];
[operation3 addexecutionblock:^];
// 建立nsoperationqueue
nsoperationqueue *queue = [[nsoperationqueue alloc] init];
// 把操作新增到佇列中
[queue addoperation:operation1];
[queue addoperation:operation2];
[queue addoperation:operation3];
}- (void)run1
- (void)run2
@end
列印效果:
注意:系統自動將nsoperationqueue中的nsoperation物件取出,將其封裝的操作放到一條新的執行緒中執行。上面的**示例中,一共有四個任務,operation1和operation2分別有乙個任務,operation3有兩個任務。一共四個任務,開啟了四條線程。通過任務執行的時間全部都是884可以看出,這些任務是並行執行的。
提示:佇列的取出是有順序的,與列印結果並不矛盾。這就好比,選手a,bc雖然起跑的順序是先a,後b,然後c,但是到達終點的順序卻不一定是a,b在前,c在後。
下面使用for迴圈列印,可以更明顯的看出任務是併發執行的。
**示例:
#import "viewcontroller.h"
@inte***ce viewcontroller ()
@end
@implementation viewcontroller
- (void)viewdidload
}];[operation3 addexecutionblock:^
}];// 建立nsoperationqueue
nsoperationqueue *queue = [[nsoperationqueue alloc] init];
// 把操作新增到佇列中
iOS開發多執行緒 執行緒安全
資源共享 1塊資源可能會被多個執行緒共享,也就是多個執行緒可能會訪問同一塊資源 比如多個執行緒訪問同乙個物件 同乙個變數 同乙個檔案 當多個執行緒訪問同一塊資源時,很容易引發資料錯亂和資料安全問題 示例一 示例二 問題 import viewcontroller.h inte ce viewcont...
iOS開發 多執行緒篇 多執行緒介紹
一 程序和執行緒 1 什麼是程序 程序是指在系統中正在執行的乙個應用程式 每個程序之間是獨立的,每個程序均執行在其專用且受保護的記憶體空間內 比如同時開啟迅雷 xcode,系統就會分別啟動2個程序 通過 活動監視器 可以檢視mac系統中所開啟的程序 3 執行緒的序列 1個執行緒中任務的執行是序列的 ...
iOS開發 多執行緒簡介
多執行緒從概念上理解是指從軟體或者硬體上實現多個執行緒併發執行的技術,簡單點理解就是同一時間可以執行多個事情 比如說一邊聽歌一邊碼 聽歌是乙個執行緒,碼 是乙個執行緒,如果是單核cpu的話,上面兩個動作其實可以確切的理解為併發,也就是偽並行,只是兩者相差的時間太快沒有察覺。電腦現在一般都是雙核的或者...