成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

利用操作隊列和信號量來實現操作同步

移動開發 iOS
最近在開發iOS過程中遇到一個問題:某一些操作需要在一個初始化操作后才允許執行。但是這些操作的執行時刻有可能比初始化操作來得要快。那么,如果不等待初始化操作后再執行的話,這些操作就等于是丟失了。

最近在開發iOS過程中遇到一個問題:某一些操作需要在一個初始化操作后才允許執行。但是這些操作的執行時刻有可能比初始化操作來得要快。那么,如果不等待初始化操作后再執行的話,這些操作就等于是丟失了。

針對這個問題,我想到了兩種解決方案:***就是執行這些操作之前先判斷是否已經初始化,如果尚未初始化則使用一個數組隊列把操作參數及調用的方法存儲起來,等待初始化完成后再檢測數組隊列中的保存的操作進行調用并清空隊列。但這種方式有個問題就是操作中傳遞的參數以及調用方法引用都需要自己來維護,這無疑是給自己帶來了一定的工作量以及風險,稍有不慎就有可能會導致內存泄露。

因此第二中解決方法就是利用串行隊列結合信號量的方式來控制操作的執行。此方案的思路是,先創建一條串行隊列,此隊列用于執行所有的操作。但是***入隊的是一個等待信號的操作。而這個信號的初始值是0,直到初始化操作完成后才會發送一個信號來通知此操作。因此,在尚未初始化完成的時候此隊列是一直處于阻塞狀態的。所以到有操作進入隊列時都會立刻執行,而是需要等到初始化信號過來后才開始執行。

為了驗證這一想法,我新建了一個應用工程,在ViewController中定義了操作隊列_quque和信號量_sema,如下:

  1. @interface ViewController : UIViewController   
  2.  
  3.  {   
  4.  
  5.  @private  
  6.  
  7.      dispatch_queue_t _queue;   
  8.  
  9.      dispatch_semaphore_t _sema;   
  10.  
  11.  }   
  12.     
  13.  
  14. @end  

初始化時創建操作隊列

  1. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil   
  2.  
  3.  {   
  4.  
  5.      if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])   
  6.  
  7.      {   
  8.  
  9.          _queue = dispatch_queue_create("cn.vimfung.demo", DISPATCH_QUEUE_SERIAL);   
  10.  
  11.     }   
  12.  
  13.          
  14.  
  15.      return self;   
  16.  
  17.  }  

在ViewController中定義了三個按鈕,分別為DoSomething、Signal、Wait。其中DoSomething為執行的操作。Signal為通知阻塞隊列可以執行操作了。Wait為阻塞當前隊列。

  1. - (void)viewDidLoad   
  2.  
  3.  {   
  4.  
  5.      [super viewDidLoad];   
  6.  
  7.      // Do any additional setup after loading the view, typically from a nib.   
  8.  
  9.          
  10.  
  11.      UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];   
  12.  
  13.      [btn setTitle:@"DoSomething" forState:UIControlStateNormal];   
  14.  
  15.      [btn sizeToFit];   
  16.  
  17.      [btn addTarget:self action:@selector(doSomethingHandler:) forControlEvents:UIControlEventTouchUpInside];   
  18.  
  19.      [self.view addSubview:btn];   
  20.  
  21.          
  22.  
  23.      UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];   
  24.  
  25.      [btn1 setTitle:@"Signal" forState:UIControlStateNormal];   
  26.  
  27.      [btn1 sizeToFit];   
  28.  
  29.      [btn1 addTarget:self action:@selector(signalHanlder:) forControlEvents:UIControlEventTouchUpInside];   
  30.  
  31.      btn1.frame = CGRectMake(0.0, 50.0, btn1.frame.size.width, btn1.frame.size.height);   
  32.  
  33.      [self.view addSubview:btn1];   
  34.  
  35.          
  36.  
  37.      UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];   
  38.  
  39.      [btn2 setTitle:@"Wait" forState:UIControlStateNormal];   
  40.  
  41.      [btn2 sizeToFit];   
  42.  
  43.      [btn2 addTarget:self action:@selector(waitHanlder:) forControlEvents:UIControlEventTouchUpInside];   
  44.  
  45.      btn2.frame = CGRectMake(0.0, 100.0, btn2.frame.size.width, btn2.frame.size.height);   
  46.  
  47.      [self.view addSubview:btn2];   
  48.  
  49.  }   
  50.  
  51.      
  52.  
  53.  - (void)doSomethingHandler:(id)sender   
  54.  
  55.  {   
  56.  
  57.      dispatch_async(_queue, ^{   
  58.  
  59.         NSLog(@"do something");   
  60.  
  61.      });   
  62.  
  63.  }   
  64.  
  65.      
  66.  
  67.  - (void)signalHanlder:(id)sender   
  68.  
  69.  {   
  70.  
  71.      dispatch_semaphore_signal(_sema);   
  72.  
  73.  }   
  74.  
  75.      
  76.  
  77.  - (void)waitHanlder:(id)sender   
  78.  
  79.  {   
  80.  
  81.      if (_sema)   
  82.  
  83.     {   
  84.  
  85.          dispatch_release(_sema);   
  86.  
  87.      }   
  88.  
  89.     _sema = dispatch_semaphore_create(0);   
  90.  
  91.     dispatch_async(_queue, ^{   
  92.  
  93.          dispatch_semaphore_wait(_sema, DISPATCH_TIME_FOREVER);   
  94.  
  95.      });   
  96.  
  97.  } 

運行后,先點擊Wait讓隊列阻塞、然后這時無論怎么點擊DoSomething都是不會有log信息顯示,直到點擊Signal后,之前點擊的DoSomething將會一一打印出來信息。

可見這種解決方案是可行的,并且可以更加容易操作。

責任編輯:張葉青 來源: 開源社區
相關推薦

2010-04-21 16:42:48

Unix信號量

2010-07-15 15:32:10

Perl線程

2021-04-13 09:20:15

鴻蒙HarmonyOS應用開發

2010-04-21 16:50:31

Unix信號量

2020-11-05 09:59:24

Linux內核信號量

2017-05-11 14:05:25

Consul分布式信號量

2010-04-21 16:25:13

Unix信號量

2021-09-07 07:53:42

Semaphore 信號量源碼

2010-04-21 15:37:38

Unix信號量

2020-09-25 07:34:40

Linux系統編程信號量

2016-11-23 16:08:24

Python處理器分布式系統

2024-07-25 11:53:53

2024-10-29 15:23:45

Python線程安全

2019-11-19 09:00:38

JavaAND信號量

2009-12-08 12:14:43

2010-03-17 16:36:10

Java信號量模型

2010-04-21 17:10:25

Unix信號量

2021-05-18 06:55:07

Java AQS源碼

2021-02-03 20:10:29

Linux信號量shell

2010-03-16 17:52:27

Java多線程信號量
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区在线播放 | 中文字幕一区在线观看视频 | 久久精品视频网站 | 久久9视频 | 久久久999国产精品 中文字幕在线精品 | 99久久免费精品国产免费高清 | 国产精品乱码一区二区三区 | 四虎在线播放 | 亚洲一区二区三区久久 | 日韩五月天 | 亚洲综合无码一区二区 | 91pao对白在线播放 | 亚洲免费在线 | 最新中文字幕第一页视频 | 久热9| 亚洲精选久久 | 亚洲视频中文字幕 | 天天躁日日躁狠狠很躁 | 免费亚洲成人 | 成人综合视频在线 | 久久大陆 | 国产精品国产三级国产a | 久久久久久亚洲精品 | 国产精品久久久av | 国内精品免费久久久久软件老师 | 日韩成人在线电影 | 黄色免费三级 | 国产精品爱久久久久久久 | 欧美日一区二区 | 一区二区三区视频 | 一级在线 | 久久精品国产久精国产 | 国产亚洲精品精品国产亚洲综合 | 日本在线网址 | 国产农村妇女精品一二区 | 亚洲精品一二三区 | 成人影院av | 天天躁日日躁狠狠躁白人 | 国产精品视频一二三区 | 天天插天天射天天干 | 天天射影院 |