iOS中的多线程一般使用场景
在IOS開發中為提高程序的運行效率會將比較耗時的操作放在子線程中執行,iOS系統進程默認啟動一個主線程,用來響應用戶的手勢操作以及UI刷新,因此主線程又叫做UI線程。
前面的Blog說明了NSThread以及GCD處理并發線程以及線程安全(線程鎖@synchronized(){}),線程通信(從子線程向主線程傳遞值,刷新界面),接下來討論線程的延遲與執行的單一化(唯一執行一次)。
1.延遲
(1)最簡單粗暴的方法是對線程本身執行掛起操作
[NSThread sleepForTimeInterval:]
另外使用隱式創建開啟線程的方法
self performSelector:withObject:afterDelay:
(2)使用GCD處理延遲操作(線程,任務)
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(<#delayInSeconds#> * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
<#code to be executed after a specified delay#>
});
2.只執行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
<#code to be executed once#>
});
3.為了方便管理任務隊列中的任務,GCD特用分組的方式來管理
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_async(group, queue, ^{
});
dispatch_group_notify(group, queue, ^{});
4.NSOperation與NSOperationQueue
為了對線程的操作更加的面向對象,APPLE對GCD進行了封裝,特將任務—->封裝成NSOperation
隊列——>封裝成NSOperationQueue
(1)NSOperation有兩個子類NSInvocationOperation以及NSBlockOperation
NSInvocationOperation的創建方法如下:
// 創建隊列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 創建操作
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download) object:nil];
// operation直接調用start,是同步執行(在當前線程執行操作)
// [operation start];
(2)NSBlockOperation的創建方法:
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”—下載圖片—-11—%@”, [NSThread currentThread]);
}];
// NSOperationQueue *queue = [NSOperationQueue mainQueue];
// 2.添加操作到隊列中(自動異步執行) [queue addOperation:operation1]; [queue addOperation:operation2]; [queue addOperation:operation3]; [queue addOperation:operation4];其中NSOperation類可以添加執行代碼塊:addExecutionBlock
【NSOperationQueue mainQueue】是獲取主隊列,其實底層相當于dispatch_get_mainQueue()
5.線程的通信
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperationWithBlock:^{
// 1.異步下載圖片
NSURL *url = [NSURL URLWithString:@”http://d.hiphotos.baidu.com/image/pic/item/37d3d539b6003af3290eaf5d362ac65c1038b652.jpg“];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];
// [self performSelectorOnMainThread:<#(SEL)#> withObject:<#(id)#> waitUntilDone:<#(BOOL)#>];
// dispatch_async(dispatch_get_main_queue(), ^{
//
// });
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.imageView.image = image;
}];
}];
控制Operation之間的運行順序可以通過添加依賴來實現
- (void)dependency
{
/**
假設有A、B、C三個操作,要求:
1. 3個操作都異步執行
2. 操作C依賴于操作B
3. 操作B依賴于操作A
*/
}
為了達到優化app性能的需求,有時候是需要控制并發線程的數目以及隊列中的線程的運行狀態
- (void)maxCount
{
// 1.創建一個隊列(非主隊列)
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// [queue cancelAllOperations]; // 取消隊列中的所有任務(不可恢復)
}
(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
// [queue setSuspended:YES]; // 暫停隊列中的所有任務
}(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
// [queue setSuspended:NO]; // 恢復隊列中的所有任務
}
總結
以上是生活随笔為你收集整理的iOS中的多线程一般使用场景的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拉卡拉刷1万手续费多少?取决于POS机类
- 下一篇: iOS中如何优化Cell中图片的下载性能