ios - 限制 iOS 应用中的 dispatch_async 任务时间

标签 ios swift grand-central-dispatch

我使用 dispatch_async 进行一些服务器调用。 有时,由于互联网连接速度较慢,此调用会花费很长时间。

我如何设置以秒为单位的限制 - 例如:任务有 3 秒要完成,否则它会停止。

最佳答案

作为MultiColour Pixel says ,你真的应该为此使用 NSURLSession

但是,如果您仍在寻找 GCD 答案,这里是...


您可以轻松地使用信号量为您的请求实现超时。

您只需要创建一个初始值为 0 的信号量,然后使用 dispatch_semaphore_wait 等待网络任务完成时发出信号,或者请求超时。

因此,如果您的网络任务是同步的,您会想要做这样的事情......

let queue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL) // your GCD queue

...

dispatch_async(queue, {

    let semaphore = dispatch_semaphore_create(0) // create semaphore

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
        self.doNetworkTask()
        dispatch_semaphore_signal(semaphore); // signal semaphore on completion
    })

    let timeout = dispatch_time(DISPATCH_TIME_NOW, Int64(3.0 * Double(NSEC_PER_SEC))) // 3 second time-out
    let returnValue = dispatch_semaphore_wait(semaphore, timeout)

    guard returnValue == 0 else { // return value is non-zero if the request timed out

        // request timed out, cancel the request here.
        self.stopNetworkTask()
        return // prevent further execution if network task was unsucessful
    }

    dispatch_async(dispatch_get_main_queue(), {
        // do processing after request success
    })

})

或者如果您的网络任务是异步的...

let queue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL) // your GCD queue

...

dispatch_async(queue, {

    let semaphore = dispatch_semaphore_create(0) // create semaphore

    self.doNetworkTaskWithCompletion({
        dispatch_semaphore_signal(semaphore); // signal semaphore on completion
    })

    let timeout = dispatch_time(DISPATCH_TIME_NOW, Int64(3.0 * Double(NSEC_PER_SEC))) // 3 second time-out
    let returnValue = dispatch_semaphore_wait(semaphore, timeout)

    guard returnValue == 0 else { // return value is non-zero if the request timed out

        // request timed out, cancel the request here.
        self.stopNetworkTask()
        return // prevent further execution if network task was unsucessful
    }

    dispatch_async(dispatch_get_main_queue(), {
        // do processing after request success
    })

})

关于ios - 限制 iOS 应用中的 dispatch_async 任务时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35365942/

相关文章:

Iphone,对于定期更新的数据,NSUserDefaults 仍然是最简单的选择吗?

json - 在 swift 中创建一个 url 对象

swift - 使用 GCD 在 Swift 3 中同步属性

ios - 使用 GCD 在 NSMutableArray 中存储图像

swift - 在表格 View 单元格中键入时键盘会覆盖 TextView

ios - 在 Swift 中使用 dispatch_async 并发分析一个数组

ios - 具有多个图像和标签的自定义单元格显示不一致

ios - 将委托(delegate)分配给第三类中另一个类的一个类

php - 使用 MKNetworkEngine 将图像 iOS 上传到 PHP - 我知道它有效,但无法让 PHP 捕获

ios - 添加到单元格的点击手势是否在重复使用时得到保留?