国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

OC-14.NSOperation與NSOperationQueue

2019-11-14 17:59:14
字體:
來源:轉載
供稿:網(wǎng)友

 

簡介


  • 通過NSOperation與NSOperationQueue的組合也能實現(xiàn)多線程
  • 通常將任務封裝成NSOperation對象,并將對象添加到NSOperationQueue中實現(xiàn)

NSOperation


  • NSOperation是一個抽象類,不能用來直接封裝操作,通常使用它的子類來封裝操作
  • 若不將NSOperation對象添加到NSOperationQueue中,操作只會在當前線程執(zhí)行,且需要手動開始執(zhí)行操作

  • NSoperation的子類

    • NSInvocationOperation

      //創(chuàng)建操作NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];//開始執(zhí)行操作[operation start];
    • NSBlockOperation(當操作數(shù)大于1時,異步執(zhí)行)

      //創(chuàng)建操作NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{    //操作封裝的任務代碼}];//添加操作[operation addExecutionBlock:^{    //操作封裝的任務代碼}];//開始執(zhí)行操作[operation start];
    • 自定義子類的步驟

      • 重寫- (void)main方法,在該方法中封裝需要執(zhí)行的操作
      • 在- (void)main方法中,需要自己建立自動釋放池(原因:若是異步操作,無法訪問主線程的自動釋放池)
      • 通過檢查cancelled等屬性,來判斷操作的狀態(tài),執(zhí)行相應的操作
  • 設置操作完成時的回調

    //創(chuàng)建操作NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{   //任務代碼}];//設置回調operation.completionBlock = ^{    //操作完成時執(zhí)行的代碼};

NSOperationQueue


  • 作用

    • 容納需要異步執(zhí)行的操作
    • 系統(tǒng)會自動執(zhí)行NSOperationQueue中的操作,不需要手動啟動
  • NSOperationQueue的相關操作

    • 創(chuàng)建操作隊列

      • [[NSOperationQueue alloc] init]
    • 獲取主操作隊列

      • + (NSOperationQueue *)mainQueue
    • 獲取當前操作隊列

      • + (nullable NSOperationQueue *)currentQueue
    • 往隊列中添加操作

      • - (void)addOperation:(NSOperation *)op
      • - (void)addOperationWithBlock:(void (^)(void))block
    • 設置最大并發(fā)操作數(shù)

      • - setMaxConcurrentOperationCount:(NSInteger)count
      • 若并發(fā)操作數(shù)為1,則為串行隊列
    • 暫停/啟動隊列中的任務

      • - setSuspended:(BOOL)b
    • 取消隊列中的任務

      • - (void)cancelAllOperations
      • 等到正在執(zhí)行的任務執(zhí)行完畢,隊列才會被掛起

實現(xiàn)多線程的步驟


  • 創(chuàng)建操作隊列

    NSOperationQueue *queue = [[NSOperationQueue alloc] init]
  • 往隊列中添加操作

    /**方法一*///創(chuàng)建操作NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download) object:nil] //download為操作封裝的任務方法NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{    //任務代碼}];//添加操作[queue addOperation:operation1];[queue addOperation:operation2];/**方法二*///添加操作[queue addOperationWithBlock:^{    //操作封裝的任務}];

操作依賴


  • 作用

    • 建立操作之間的執(zhí)行順序關系
    • 操作依賴是面向操作的,可以跨隊列建立操作之間的依賴關系
    • 若要建立操作之間的依賴關系,必須在操作被添加到隊列之前建立
  • 建立操作依賴的步驟

    • 創(chuàng)建操作隊列

      NSOperationQueue *queue = [[NSOperationQueue alloc] init]
    • 添加操作

      NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{    //任務1代碼}];NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{    //任務2代碼}];
    • 建立依賴關系(必須在操作被添加到隊列之前)

      [operation1 addDependency:operation2];
    • 將操作添加到隊列

      [queue addOperation:operation1];[queue addOperation:operation2];

線程之間的通信


  • 從主線程到子線程

    • 從主線程到子線程的切換,通常是系統(tǒng)自動完成的,只需要將操作添加到隊列中,系統(tǒng)就會根據(jù)實際需要,是否切換到子線程中執(zhí)行操作
  • 從子線程到主線程

    • 將需要執(zhí)行的操作,添加到主操作隊列中即可(該操作將運行在主runLoop的common模式下)

      [[NSOperationQueue mainQueue] addOperationWithBlock:^{        //需要在主線程中執(zhí)行的任務代碼    }];

       

 
 

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 思南县| 德保县| 海宁市| 楚雄市| 靖州| 吴堡县| 永和县| 策勒县| 宁都县| 涪陵区| 浪卡子县| 务川| 梓潼县| 合江县| 固镇县| 延庆县| 龙州县| 分宜县| 苗栗市| 田林县| 广东省| 通辽市| 阿合奇县| 黎平县| 龙井市| 灵武市| 胶州市| 施秉县| 古交市| 巴彦县| 台安县| 铜陵市| 昌黎县| 肃南| 洛川县| 霍城县| 揭阳市| 油尖旺区| 贺州市| 松溪县| 临朐县|