相比GCD NSOperation更加的靈活
1.NSInvocationOperation
創(chuàng)建操作 ---> 創(chuàng)建隊列 ---> 操作加入隊列
// 處理事務
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(handleInvocation:) object:@"hello"];
//如果沒有創(chuàng)建隊列直接啟動事務就在主線程里
//[op start];
// 創(chuàng)建隊列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 操作加入隊列
[queue addOperation:op];
//在這里不可以啟動摘昌,因為已經(jīng)啟動,此時在去啟動就會把一個在running狀態(tài)的隊列重新start 造成線程混亂直接GG
//可以用 [[NSOperationQueue mainQueue] addOperation:op];
//[op start];
2.NSBlockOperation
相比NSInvocationOperation子巾,NSBlockOperation是函數(shù)式編程,代碼可讀性更強
//1:創(chuàng)建blockOperation
NSBlockOperation *bo = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
sleep(3);
}];
//1.1 添加執(zhí)行代碼塊
[bo addExecutionBlock:^{
NSLog(@"這是一個執(zhí)行代碼塊 - %@",[NSThread currentThread]);
}];
//1.2 設置監(jiān)聽
bo.completionBlock = ^{
NSLog(@"完成了!!!");
};
//2:創(chuàng)建隊列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//3:添加到隊列
[queue addOperation:bo];
NSLog(@"事務添加進了NSOperationQueue");
3.優(yōu)先級
- (void)demo{
// 優(yōu)先級
NSBlockOperation *bo1 = [NSBlockOperation blockOperationWithBlock:^{
for (int i = 0; i < 10; i++) {
NSLog(@"**第一個操作** %d --- %@", i, [NSThread currentThread]);
}
}];
// 設置優(yōu)先級 - 最高
bo1.qualityOfService = NSQualityOfServiceUserInteractive;
//創(chuàng)建第二個操作
NSBlockOperation *bo2 = [NSBlockOperation blockOperationWithBlock:^{
for (int i = 0; i < 10; i++) {
NSLog(@"第二個操作 %d --- %@", i, [NSThread currentThread]);
}
}];
// 設置優(yōu)先級 - 最低
bo2.qualityOfService = NSQualityOfServiceBackground;
//2:創(chuàng)建隊列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//3:添加到隊列
[queue addOperation:bo1];
[queue addOperation:bo2];
}
4.線程通訊
- (void)demo {
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.name = @"hello";
[queue addOperationWithBlock:^{
NSLog(@"%@ = %@",[NSOperationQueue currentQueue],[NSThread currentThread]);
//模擬請求網(wǎng)絡
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@"%@ --%@",[NSOperationQueue currentQueue],[NSThread currentThread]);
}];
}];
}
5.控制并發(fā)量
- (void)demo {
// 設置并發(fā)數(shù)
self.queue.name = @"hello";
self.queue.maxConcurrentOperationCount = 2;
for (int i = 0; i<10; i++) {
[self.queue addOperationWithBlock:^{ // 一個任務
[NSThread sleepForTimeInterval:2];
NSLog(@"%d-%@",i,[NSThread currentThread]);
}];
}
}
6.依賴關系
- (void)demo{
NSBlockOperation *bo1 = [NSBlockOperation blockOperationWithBlock:^{
[NSThread sleepForTimeInterval:0.5];
NSLog(@"請求token");
}];
NSBlockOperation *bo2 = [NSBlockOperation blockOperationWithBlock:^{
[NSThread sleepForTimeInterval:0.5];
NSLog(@"拿著token,請求數(shù)據(jù)1");
}];
NSBlockOperation *bo3 = [NSBlockOperation blockOperationWithBlock:^{
[NSThread sleepForTimeInterval:0.5];
NSLog(@"拿著數(shù)據(jù)1,請求數(shù)據(jù)2");
}];
// 建立依賴最容易犯的問題就是循環(huán)嵌套
[bo2 addDependency:bo1];
[bo3 addDependency:bo2];
//[bo1 addDependency:bo3];
[self.queue addOperations:@[bo1,bo2,bo3] waitUntilFinished:YES];
NSLog(@"執(zhí)行完了?我要干其他事");
}
7.掛起、繼續(xù)迈螟、取消
正在執(zhí)行的操作無法掛起或者取消
執(zhí)行結果發(fā)現(xiàn),正在執(zhí)行的操作無法取消,因為這要回想到之前的NSThread
只有在內(nèi)部判斷才能取消完畢