ios - 如何在 Swift 完成外部异步请求之前先完成内部异步请求?

标签 ios swift asynchronous

一段时间以来,我一直在努力实现这一目标,但无法让它发挥作用。

首先让我展示一个简单的示例代码:

override func viewDidLoad()
{
    super.viewDidLoad()

    methodOne("some url bring")
}

func methodOne(urlString1: String)
{
    let targetURL = NSURL(string: urlString1)

    let task = NSURLSession.sharedSession().dataTaskWithURL(targetURL!) {(data, response, error) in

        // DO STUFF
        j = some value

        print("Inside Async1")
        for k in j...someArray.count - 1
        {  
            print("k = \(k)")
            print("Calling Async2")
            self.methodTwo("some url string")
        }

    }

    task.resume()
}

func methodTwo(urlString2: String)
{
    let targetURL = NSURL(string: urlString2)

    let task = NSURLSession.sharedSession().dataTaskWithURL(targetURL!) {(data, response, error) in

        // DO STUFF
        print("inside Async2")
    }

    task.resume()
}

我基本上做的是在我的 methodOne 中执行一个异步请求,在该函数中,我调用我的 methodTwo 来执行另一个异步请求。

我遇到的问题是,当 methodTwo 被调用时,它永远不会进入异步 session 。然而,它确实在 methodTwo 中进入异步 session ,但只有一次 k = someArray.count - 1。它基本上是排队到最后,这不是我想要实现的。

这是一个示例输出:

Inside Async1
k = 0
Calling Async2
Inside Async1
k = 0
Calling Async2
k = 1
Calling Async2
Inside Async1
k = 0
Calling Async2
k = 1
Calling Async2
k = 2
Calling Async2
Inside Async1
.....
Inside Async1
k = 0
Calling Async2
k = 1
Calling Async2
k = 2
Calling Async2
k = 3
Calling Async2
k = 4
Inside Async2

换句话说,我希望在 methodOne 的异步请求完成之前,在每次迭代中完成来自 methodTwo 的异步请求。

这是我的目标的示例输出:

Inside Async1
k = 0
Calling Async2
Inside Async2
Inside Async1
k = 1
Calling Async2
Inside Async2
Inside Async1
...

我在这里找到了类似的东西:Wait until first async function is completed then execute the second async function

但是,我无法将其与建议和解决方案一起使用。

有人能指出我正确的方向吗?

谢谢

最佳答案

实现此目的的一种方法是更改​​ methodTwo() 以接受回调作为参数,然后您可以使用信号量:

func methodOne(urlString1: String) {
    let targetURL = NSURL(string: urlString1)
    let task = NSURLSession.sharedSession().dataTaskWithURL(targetURL!) { data, response, error in
        let queue = dispatch_queue_create("org.myorg.myqueue", nil)
        dispatch_async(queue) {

            // DO STUFF
            j = some value

            print("Inside Async1")
            for k in j...someArray.count - 1 {  
                print("k = \(k)")

                print("Calling Async2")
                dispatch_semaphore_t sem = dispatch_semaphore_create(0);
                self.methodTwo("some url string") {
                    dispatch_semaphore_signal(sem);
                }
                dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
            }
        }
    }
    task.resume()
}

func methodTwo(urlString2: String, callback: (() -> ())) {
    let targetURL = NSURL(string: urlString2)
    let task = NSURLSession.sharedSession().dataTaskWithURL(targetURL!) { data, response, error in

        // DO STUFF
        print("inside Async2")
        callback()
    }
    task.resume()
}

请注意,为了不阻塞 methodOne 任务回调的委托(delegate)队列,该示例创建了自己的队列,您可以随意阻塞。

关于ios - 如何在 Swift 完成外部异步请求之前先完成内部异步请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37201735/

相关文章:

ios - 启用位码是否适用于 iOS 9(iOS 7/8)之前的 iOS 版本?

iphone - 比较两个 NSArray 的最佳实践 & 用两个都没有出现的对象填充第三个?

ios - WebRTC iOS 13 模拟器 - 红屏 H264 解码

swift - 在 swift 3.0 中使用 optional 和不使用 optional 声明非赋值变量有什么区别

javascript - 如何在nodeJS的forEach中正确使用async

ios - 具有捕捉和缩放功能的 ScrollView

ios - 如何知道 UIVIewController 是否显示为 Peek Preview Controller

Swift:自定义搜索栏布局问题

java - Spring @Async 与可完成的 future 运行异步

c# - 如何通过对原始序列的值运行任务来创建 Rx 序列?