【问题标题】:dispatch_semaphore_t in swift 3swift 3中的dispatch_semaphore_t
【发布时间】:2017-09-06 10:08:49
【问题描述】:

我在objective C 中使用以下代码来处理信号量。

-(void)doSome{
    semaphore = dispatch_semaphore_create(0);

    BaseViewController *baseVC = [[BaseViewController alloc]init];
    if(baseVC.isUserObjectExist){
        [self callLoginWebService:baseVC.userObject.username passwordString:baseVC.userObject.password];
    }else{
        dispatch_semaphore_signal(semaphore);
    }

    while (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW)) { //2
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:100]];
    }

}

但是

'dispatch_semaphore_t' 在 Swift 中不可用

swift 3 中如何集成信号量?

【问题讨论】:

  • 不要对这种异步方法调用使用信号量。使用完成处理程序。
  • @vadian,我想在闪屏下调用异步方法。有什么更好的方法。如何使用完成处理程序来实现它。请指导。

标签: ios swift3 semaphore dispatch


【解决方案1】:

你可以创建

let semaphore = DispatchSemaphore(value: 0)

Learn official document of Apple

或来自其他代码

let url = URL(string: "")
        let semaphore = DispatchSemaphore(value: 0) // 1
        let _ = DownloadPhoto(url: url!) {
            _, error in
            if let error = error {
            }
            semaphore.signal() // 2
        }
        let timeout = DispatchTime.now() + .seconds(5)
        if semaphore.wait(timeout: timeout) == .timedOut { // 3
        }

【讨论】:

  • 你通过value为0。它的意义是什么。
  • 2.就我而言,来自DownloadPhoto 的回调在主队列中。所以信号量永远不会得到信号。如何使用主队列处理信号量。
  • 哈哈,同样的问题,需要完全一样的测试,2.5年没有答案:(
猜你喜欢
  • 2017-01-18
  • 2017-07-26
  • 2017-04-02
  • 2017-02-13
  • 2017-04-09
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多