+ 发表新主题
显示结果从 1 到 3 共计 3 条
  1. #1
    icyblazek 的头像 Pro开发者
    注册日期
    Jun 2013
    帖子
    3
    被提到
    0 个帖子

    Exclamation [注意]dispatch_semaphore_t 信号等待问题

    好久之前写一个Copy文件的功能时,需要更新界面的进度条,犯了一个小小的错误,造成文件Copy完成时,才会去更新界面

    代码 :
    -(void)startCopy
    {
    	[progressIndicator setMaxValue: 100];
    	dispatch_semaphore_t sem = dispatch_semaphore_create(0);
    	dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(void){
     
    		for (int i = 0; i < 100; i++){
    			[NSThread sleepForTimeInterval: 1];
    			dispatch_async(dispatch_get_main_queue(), ^(void){
    				//update UI
    				[progressIndicator setDoubleValue: i];
    			});
    		}
    		dispatch_semaphore_signal(sem);
    	});
    	dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
    	NSLog(@"Finished!")
    }
    上面代码在执行
    代码 :
    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
    完成后,主线程就在等待sem信号完成.
    但在线程里面的代码执行时
    代码 :
    dispatch_async(dispatch_get_main_queue(), ^(void){
    	//update UI
    	[progressIndicator setDoubleValue: i];
    });
    又回到主线程里执行,但由于主线程还在等待sem信号,所以导致这段代码一定要等整个线程执行完成,
    上面的代码才执行,所以造成界面最后最后更新了一下(事实上也执行了100次).

  2. #2
    keefo 的头像 Administrator
    注册日期
    Jul 2013
    住址
    Vancouver
    帖子
    327
    被提到
    5 个帖子

    回复: [注意]dispatch_semaphore_t 信号等待问题

    为何需要用semaphore?

  3. #3
    Janselz 的头像 初级会员
    注册日期
    Jul 2013
    住址
    Shanghai
    帖子
    27
    被提到
    0 个帖子

    回复: [注意]dispatch_semaphore_t 信号等待问题

    这个代码写的好奇怪 - -

发帖规则

  • 不可以发表新主题
  • 不可以发表回复
  • 不可以上传附件
  • 不可以编辑自己的帖子
  •