ios - 处理背靠背 HTTP 帖子 SWIFT 4.0

标签 ios swift api post swift4

我目前正在尝试从服务器获取一些数据。为此,我必须创建一个 JSON(req1) 对象并将其作为请求发送到第一个 API。然后,API 返回给我一个 JSON(res1)。我必须从该 JSON(res1) 中提取一些数据(非常长,我们称之为 Data1)并创建另一个 JSON 对象 (req2),并用它作为请求点击另一个 API 并等待响应 (res2)。

现在,它是一个背靠背函数。当我调用第一个 API 时,需要很长时间才能响应,到那时,我的第二个 API 就会被调用。因此,我从服务器收到错误。我该怎么克服这个?

算法:

  1. 调用 API_A()
  2. 收到 JSON_A
  3. 提取 JSON_A 4.调用API_B(JASON_A.someparts)
  4. 收到 JSON_B
  5. 提取 JSON_B

下面是代码:

let json1 = JSON()
let json2 = JSON() //my final result

override func viewDidLoad() {
        super.viewDidLoad()
	    firstApiHit { () -> () in
            secondApiHit(jsonV: json1)
        }
    }

func firstApiHit(handleComplete:(()->())){
	let url1 = URL(string : firstApiURL) 
	let json: [String: String] = ["Data1:Data1Rest"]
	let jsonData = try? JSONSerialization.data(withJSONObject: json)
	json1 = httpPost(jsonData: jsonData!, url: url1!)  //hit to the first API!
	handleComplete()
}

func secondApiHit(jsonV : JSON){
	let url1 = URL(string : secondApiURL)
	var value = String()
	extractedValue = String(describing:jsonV["DataX"])
	var json = [String: String]()
	json = ["Data1":extractedValue]
	let jsonData = try? JSONSerialization.data(withJSONObject: json)
    let json2 = httpPost(jsonData: jsonData!, url: url2!) // my final result!
		//Need the json2 as the final Result!!
}
    
func httpPost(jsonData: Data, url: URL) -> JSON {
	if !jsonData.isEmpty {
		var request = URLRequest(url: url)
		request.httpMethod = "POST"
		request.httpBody = jsonData
		request.setValue("application/json", forHTTPHeaderField: "Content-Type")
		URLSession.shared.getAllTasks { (openTasks: [URLSessionTask]) in
									   print("open tasks: \(openTasks)")
									  }
		let task = URLSession.shared.dataTask(with: request) { data, response, error in
														  guard let data = data, error == nil else {   
															// check for fundamental networking error
															  print("error=\(String(describing: error))")
															  return
														  }
 		   	if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {           
					// check for http errors
				print("statusCode should be 200, but is \(httpStatus.statusCode)")
				print("response = \(String(describing: response))")
			}
																  
			let jsonX = JSON(data: data) //extracting the data! 
		}	
    	task.resume()
	}
    return jsonM
}

最佳答案

httpPost(...)URLSession.shared.dataTask(...) 完成之前返回,因为后者是异步运行的。

firstApiHit(...) 中,您不应调用 handleComplete(),而应将其传递给 httpPost(...) >。您还需要将 JSON 作为参数传递。

override func viewDidLoad() {
    super.viewDidLoad()
    firstApiHit { json in
        secondApiHit(jsonV: json)
    }
}

func firstApiHit(handleComplete: JSON -> Void){
    ...
    json1 = httpPost(jsonData: jsonData!, url: url1!, handleComplete)
}

func httpPost(jsonData: Data, url: URL, responseHandler: (JSON) -> Void) {
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        ...                                   
        let jsonX = JSON(data: data)
        responseHandler(jsonX)
    }   
}

肯定需要学习如何使用闭包,更具体地说,需要学习如何使用响应处理程序模式。否则你会一次又一次陷入痛苦的世界。

关于ios - 处理背靠背 HTTP 帖子 SWIFT 4.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46846134/

相关文章:

ios - 如何使 iOS 中的 PhoneGap 状态栏变为半透明?

swift - 如何将 SKPhysicsBody 应用于贝塞尔曲线?

swift - NSOpenPanel 作为工作表

ios - 将一个项目插入集合中会重新加载 collectionView 中的每个项目

java - 如何在 Java 中以高效的方式进行多个 API 调用

ios - 如何调整 UITableView tableHeaderView 的左右 insets 或 margins?

ios - 管理 iOS 应用程序的多个版本

windows - Windows "netstat -b"如何确定拥有每个套接字的进程的名称?

ios - 有没有办法在 Interface Builder 中设置 UINavigationBar 的委托(delegate)?

python - 在 View 中获取 JSON 请求(使用 Django)