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:如何在异步 urlsession 函数中返回一个值?