Swift UrlSession 在 UrlSession 中不起作用

Posted

技术标签:

【中文标题】Swift UrlSession 在 UrlSession 中不起作用【英文标题】:Swift UrlSession Not work inside UrlSession 【发布时间】:2020-06-27 13:12:10 【问题描述】:

所以我想解析 json api,但是我获取该参数来解析的方式我需要获取另一个 json(它正在工作),并且由于我无法将我的第二个 json api 的数据参数放入全局变量中,所以我可以把它放到另一个函数中,我有这个想法,我在第一个 urlSession 中解析我的第二个 json api,但我总是得到一个 nil 回调,

override func viewDidLoad() 
    super.viewDidLoad()
    
    
    getRoom()
    
    


func getRoom() 
    
    guard let url = URL(Some url) else return
    
    print(url)
    URLSession.shared.dataTask(with: url)  data, resp, err in
        guard let data = data else return
        
        do
            let decoder = JSONDecoder()
            let room = try decoder.decode(User.self, from: data)
            self.dataClient = [room].compactMap$0!.data
            self.DATA = [room]
            print("ini dataClient ????\(self.dataClient)")
            let roomid = self.dataClient[0].RoomID
            self.roomId = roomid
            print(self.roomId)
            
            DispatchQueue.main.async 
                 checkRoom()
            
        catch
            print(err!)
        
    .resume()
    


func checkRoom() 
    
    if self.roomId == 0 
        print("roomId nil")
    else if self.roomId != 0
        print("ini room id \(self.roomId)")

        guard let urlRoom = URL(some url) else return
        
        URLSession.shared.dataTask(with: urlRoom)  (data, resp, err) in
            guard let data = data else return
            do
                let decoder = JSONDecoder()
                let roomAv = try decoder.decode(User.self, from: data)
                self.DATA = [roomAv]
                print("ini boolnya ???? \(self.DATA[0].success)")
                print("Success")
            catch
                print("damn????") // this line always get called 
            
        .resume()
    

谁能告诉我任何想法?我将第二个 urlsession 放在第一个 urlsession 中的原因是因为我在第二个 Json api 中需要那个 (self.roomId) 作为我的参数。

当我尝试在我的 checkRoom() 中分离两个 urlsession 函数时,总是称为“roomId Nil”

【问题讨论】:

不能直接把roomId作为参数传递checkRoom(roomId)吗?您是否验证过 json 解码工作正常? 我已经验证了邮递员的 json 解码及其工作,但我想知道如何像您说的先生那样将 roomId 作为参数传递 将 checkRoom 方法更改为 func checkRoom(roomId: Int) 并将异步调度调用更改为 DispatchQueue.main.async checkRoom(roomId) 。请注意,我假设 roomId 是一个整数 【参考方案1】:

我不会亲自打电话。那是自找麻烦。只需调用第一个端点,从中获取数据,然后将您需要的任何内容传递到逻辑控制器中的第二个调用中。

准码:

import Foundation

class Test 
    func getRoom() 
        getFirstCall  [weak self] (foo) in
            self?.getSecondCall(someArg: foo) 
                // Handle data here.
            
        
    
    
    func getFirstCall(completion: @escaping (_ somethingToReturn: String) -> ()) 
        
        guard let url = URL(string: "Some URL") else  return 
        
        URLSession.shared.dataTask(with: url)  data, response, error in
            // Logic to ingest data.
            completion("foo")
        .resume()
    
    
    func getSecondCall(someArg: String, completion: @escaping () -> ()) 
        
        guard let url = URL(string: "Some URL 2") else  return 
        
        // Use "someArg" however you need in this call. queryParam, body, etc.
        
        URLSession.shared.dataTask(with: url)  data, response, error in
            // Logic to ingest data.
            completion()
        .resume()
    

【讨论】:

啊,好的先生,谢谢您的指导,我会尝试这个方法

以上是关于Swift UrlSession 在 UrlSession 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 URLSession 发送空请求

如何在 Swift 3 中使用带有代理的 URLSession

Swift:如何在异步 urlsession 函数中返回一个值?

Swift:如何在异步 urlsession 函数中返回一个值?

swift--使用URLSession异步加载图片

从未调用过 Swift 身份验证挑战 URLSession