Swift UrlSession 在 UrlSession 内部不起作用
Swift UrlSession Not work inside UrlSession
所以我想解析 json api,但是我获取该参数进行解析的方式我需要获取另一个 json(正在工作),因为我不能将我的第二个 json api 的数据参数放入全局变量中,这样我就可以将它放入另一个函数中,我有这个想法,我在里面解析了我的第二个 json api第一个 urlSession,但我总是得到一个零回调,
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{[=11=]!.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 中的原因是因为我需要 (self.roomId) 作为我的第二个 Json api.
中的参数
当我尝试在我的 checkRoom() 中分离两个 urlsession 函数时,总是称为“roomId Nil”
我不会亲自在通话中拨打电话。那是自找麻烦。只需调用第一个端点,从中获取数据并将您需要的任何内容传递到逻辑控制器中的第二个调用中。
准代码:
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()
}
}
所以我想解析 json api,但是我获取该参数进行解析的方式我需要获取另一个 json(正在工作),因为我不能将我的第二个 json api 的数据参数放入全局变量中,这样我就可以将它放入另一个函数中,我有这个想法,我在里面解析了我的第二个 json api第一个 urlSession,但我总是得到一个零回调,
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{[=11=]!.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 中的原因是因为我需要 (self.roomId) 作为我的第二个 Json api.
中的参数当我尝试在我的 checkRoom() 中分离两个 urlsession 函数时,总是称为“roomId Nil”
我不会亲自在通话中拨打电话。那是自找麻烦。只需调用第一个端点,从中获取数据并将您需要的任何内容传递到逻辑控制器中的第二个调用中。
准代码:
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()
}
}