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

首頁(yè) > 網(wǎng)站 > 建站經(jīng)驗(yàn) > 正文

iOS開(kāi)發(fā):隊(duì)列和信號(hào)量該!如何同步

2019-11-02 14:25:17
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
兔兔電影網(wǎng)[www.aikan.tv/special/tutudianyingwang/]

   針對(duì)這個(gè)問(wèn)題,我想到了兩種解決方案:第一就是執(zhí)行這些操作之前先判斷是否已經(jīng)初始化,如果尚未初始化則使用一個(gè)數(shù)組隊(duì)列把操作參數(shù)及調(diào)用的方法存儲(chǔ)起來(lái),等待初始化完成后再檢測(cè)數(shù)組隊(duì)列中的保存的操作進(jìn)行調(diào)用并清空隊(duì)列。但這種方式有個(gè)問(wèn)題就是操作中傳遞的參數(shù)以及調(diào)用方法引用都需要自己來(lái)維護(hù),這無(wú)疑是給自己帶來(lái)了一定的工作量以及風(fēng)險(xiǎn),稍有不慎就有可能會(huì)導(dǎo)致內(nèi)存泄露。

  因此第二中解決方法就是利用串行隊(duì)列結(jié)合信號(hào)量的方式來(lái)控制操作的執(zhí)行。此方案的思路是,先創(chuàng)建一條串行隊(duì)列,此隊(duì)列用于執(zhí)行所有的操作。但是最先入隊(duì)的是一個(gè)等待信號(hào)的操作。而這個(gè)信號(hào)的初始值是0,直到初始化操作完成后才會(huì)發(fā)送一個(gè)信號(hào)來(lái)通知此操作。因此,在尚未初始化完成的時(shí)候此隊(duì)列是一直處于阻塞狀態(tài)的。所以到有操作進(jìn)入隊(duì)列時(shí)都會(huì)立刻執(zhí)行,而是需要等到初始化信號(hào)過(guò)來(lái)后才開(kāi)始執(zhí)行。

  為了驗(yàn)證這一想法,我新建了一個(gè)應(yīng)用工程,在ViewController中定義了操作隊(duì)列_quque和信號(hào)量_sema,如下:

  @interface ViewController : UIViewController

  {

  @private

  dispatch_queue_t _queue;

  dispatch_semaphore_t _sema;

  }

  @end

  初始化時(shí)創(chuàng)建操作隊(duì)列

  - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

  {

  if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])

  {

  _queue = dispatch_queue_create("cn.vimfung.demo", DISPATCH_QUEUE_SERIAL);

  }

  return self;

  }

  在ViewController中定義了三個(gè)按鈕,分別為DoSomething、Signal、Wait。其中DoSomething為執(zhí)行的操作。Signal為通知阻塞隊(duì)列可以執(zhí)行操作了。Wait為阻塞當(dāng)前隊(duì)列。

  - (void)viewDidLoad

  {

  [super viewDidLoad];

  // Do any additional setup after loading the view, typically from a nib.

  UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];

  [btn setTitle:@"DoSomething" forState:UIControlStateNormal];

  [btn sizeToFit];

  [btn addTarget:self action:@selector(doSomethingHandler:) forControlEvents:UIControlEventTouchUpInside];

  [self.view addSubview:btn];

  UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];

  [btn1 setTitle:@"Signal" forState:UIControlStateNormal];

  [btn1 sizeToFit];

  [btn1 addTarget:self action:@selector(signalHanlder:) forControlEvents:UIControlEventTouchUpInside];

  btn1.frame = CGRectMake(0.0, 50.0, btn1.frame.size.width, btn1.frame.size.height);

  [self.view addSubview:btn1];

  UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];

  [btn2 setTitle:@"Wait" forState:UIControlStateNormal];

  [btn2 sizeToFit];

  [btn2 addTarget:self action:@selector(waitHanlder:) forControlEvents:UIControlEventTouchUpInside];

  btn2.frame = CGRectMake(0.0, 100.0, btn2.frame.size.width, btn2.frame.size.height);

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 乌苏市| 东宁县| 夹江县| 洛浦县| 凌源市| 甘南县| 和顺县| 忻州市| 彩票| 成武县| 巧家县| 胶南市| 德令哈市| 金乡县| 兴和县| 卓尼县| 鄯善县| 四平市| 桐庐县| 静乐县| 竹溪县| 鄂尔多斯市| 洛宁县| 资源县| 新郑市| 郓城县| 丹棱县| 类乌齐县| 聊城市| 贵德县| 靖江市| 登封市| 萍乡市| 涡阳县| 梅河口市| 阿尔山市| 临猗县| 龙门县| 千阳县| 合江县| 思茅市|