html5中文学习网

您的位置: 首页 > ios » 正文

iOS开发:队列和信号量该如何同步_IOS开发

[ ] 已经帮助:人解决问题

   针对这个问题,我想到了两种解决方案:第一就是执行这些操作之前先判断是否已经初始化,如果尚未初始化则使用一个数组队列把操作参数及调用的方法存储起来,等待初始化完成后再检测数组队列中的保存的操作进行调用并清空队列。但这种方式有个问题就是操作中传递的参数以及调用方法引用都需要自己来维护,这无疑是给自己带来了一定的工作量以及风险,稍有不慎就有可能会导致内存泄露。M9SHTML5中文学习网 - HTML5先行者学习网

  因此第二中解决方法就是利用串行队列结合信号量的方式来控制操作的执行。此方案的思路是,先创建一条串行队列,此队列用于执行所有的操作。但是最先入队的是一个等待信号的操作。而这个信号的初始值是0,直到初始化操作完成后才会发送一个信号来通知此操作。因此,在尚未初始化完成的时候此队列是一直处于阻塞状态的。所以到有操作进入队列时都会立刻执行,而是需要等到初始化信号过来后才开始执行。M9SHTML5中文学习网 - HTML5先行者学习网

  为了验证这一想法,我新建了一个应用工程,在ViewController中定义了操作队列_quque和信号量_sema,如下:M9SHTML5中文学习网 - HTML5先行者学习网

  @interface ViewController : UIViewControllerM9SHTML5中文学习网 - HTML5先行者学习网

  {M9SHTML5中文学习网 - HTML5先行者学习网

  @privateM9SHTML5中文学习网 - HTML5先行者学习网

  dispatch_queue_t _queue;M9SHTML5中文学习网 - HTML5先行者学习网

  dispatch_semaphore_t _sema;M9SHTML5中文学习网 - HTML5先行者学习网

  }M9SHTML5中文学习网 - HTML5先行者学习网

  @endM9SHTML5中文学习网 - HTML5先行者学习网

  初始化时创建操作队列M9SHTML5中文学习网 - HTML5先行者学习网

  - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNilM9SHTML5中文学习网 - HTML5先行者学习网

  {M9SHTML5中文学习网 - HTML5先行者学习网

  if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])M9SHTML5中文学习网 - HTML5先行者学习网

  {M9SHTML5中文学习网 - HTML5先行者学习网

  _queue = dispatch_queue_create("cn.vimfung.demo", DISPATCH_QUEUE_SERIAL);M9SHTML5中文学习网 - HTML5先行者学习网

  }M9SHTML5中文学习网 - HTML5先行者学习网

  return self;M9SHTML5中文学习网 - HTML5先行者学习网

  }M9SHTML5中文学习网 - HTML5先行者学习网

  在ViewController中定义了三个按钮,分别为DoSomething、Signal、Wait。其中DoSomething为执行的操作。Signal为通知阻塞队列可以执行操作了。Wait为阻塞当前队列。M9SHTML5中文学习网 - HTML5先行者学习网

  - (void)viewDidLoadM9SHTML5中文学习网 - HTML5先行者学习网

  {M9SHTML5中文学习网 - HTML5先行者学习网

  [super viewDidLoad];M9SHTML5中文学习网 - HTML5先行者学习网

  // Do any additional setup after loading the view, typically from a nib.M9SHTML5中文学习网 - HTML5先行者学习网

  UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];M9SHTML5中文学习网 - HTML5先行者学习网

  [btn setTitle:@"DoSomething" forState:UIControlStateNormal];M9SHTML5中文学习网 - HTML5先行者学习网

  [btn sizeToFit];M9SHTML5中文学习网 - HTML5先行者学习网

  [btn addTarget:self action:@selector(doSomethingHandler:) forControlEvents:UIControlEventTouchUpInside];M9SHTML5中文学习网 - HTML5先行者学习网

  [self.view addSubview:btn];M9SHTML5中文学习网 - HTML5先行者学习网

  UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];M9SHTML5中文学习网 - HTML5先行者学习网

  [btn1 setTitle:@"Signal" forState:UIControlStateNormal];M9SHTML5中文学习网 - HTML5先行者学习网

  [btn1 sizeToFit];M9SHTML5中文学习网 - HTML5先行者学习网

  [btn1 addTarget:self action:@selector(signalHanlder:) forControlEvents:UIControlEventTouchUpInside];M9SHTML5中文学习网 - HTML5先行者学习网

  btn1.frame = CGRectMake(0.0, 50.0, btn1.frame.size.width, btn1.frame.size.height);M9SHTML5中文学习网 - HTML5先行者学习网

  [self.view addSubview:btn1];M9SHTML5中文学习网 - HTML5先行者学习网

  UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];M9SHTML5中文学习网 - HTML5先行者学习网

  [btn2 setTitle:@"Wait" forState:UIControlStateNormal];M9SHTML5中文学习网 - HTML5先行者学习网

  [btn2 sizeToFit];M9SHTML5中文学习网 - HTML5先行者学习网

  [btn2 addTarget:self action:@selector(waitHanlder:) forControlEvents:UIControlEventTouchUpInside];M9SHTML5中文学习网 - HTML5先行者学习网

  btn2.frame = CGRectMake(0.0, 100.0, btn2.frame.size.width, btn2.frame.size.height);M9SHTML5中文学习网 - HTML5先行者学习网

  [self.view addSubview:btn2];M9SHTML5中文学习网 - HTML5先行者学习网

  }M9SHTML5中文学习网 - HTML5先行者学习网

  - (void)doSomethingHandler:(id)senderM9SHTML5中文学习网 - HTML5先行者学习网

  {M9SHTML5中文学习网 - HTML5先行者学习网

  dispatch_async(_queue, ^{M9SHTML5中文学习网 - HTML5先行者学习网

  NSLog(@"do something");M9SHTML5中文学习网 - HTML5先行者学习网

  });M9SHTML5中文学习网 - HTML5先行者学习网

  }M9SHTML5中文学习网 - HTML5先行者学习网

  - (void)signalHanlder:(id)senderM9SHTML5中文学习网 - HTML5先行者学习网

  {M9SHTML5中文学习网 - HTML5先行者学习网

  dispatch_semaphore_signal(_sema);M9SHTML5中文学习网 - HTML5先行者学习网

  }M9SHTML5中文学习网 - HTML5先行者学习网

  - (void)waitHanlder:(id)senderM9SHTML5中文学习网 - HTML5先行者学习网

  {M9SHTML5中文学习网 - HTML5先行者学习网

  if (_sema)M9SHTML5中文学习网 - HTML5先行者学习网

  {M9SHTML5中文学习网 - HTML5先行者学习网

  dispatch_release(_sema);M9SHTML5中文学习网 - HTML5先行者学习网

  }M9SHTML5中文学习网 - HTML5先行者学习网

  _sema = dispatch_semaphore_create(0);M9SHTML5中文学习网 - HTML5先行者学习网

  dispatch_async(_queue, ^{M9SHTML5中文学习网 - HTML5先行者学习网

  dispatch_semaphore_wait(_sema, DISPATCH_TIME_FOREVER);M9SHTML5中文学习网 - HTML5先行者学习网

  });M9SHTML5中文学习网 - HTML5先行者学习网

  }M9SHTML5中文学习网 - HTML5先行者学习网

  运行后,先点击Wait让队列阻塞、然后这时无论怎么点击DoSomething都是不会有log信息显示,直到点击Signal后,之前点击的DoSomething将会一一打印出来信息。M9SHTML5中文学习网 - HTML5先行者学习网

  可见这种解决方案是可行的,并且可以更加容易操作。M9SHTML5中文学习网 - HTML5先行者学习网

(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助