调用 API 花费太多时间来获得响应的问题
Issues with calling an API taking too much time to get a response
我正在 iOS (swift) 中调用 API。一切正常,但在大约 40 或 60 秒内获得响应时花费了太多时间。我不知道为什么会这样。让我向您展示我的 API 调用方法:
代码
func userDetailAPI(){
let preferences = UserDefaults.standard
let uid = "u_id"
let acctkn = "acc_tkn"
if preferences.object(forKey: uid) == nil {
// Doesn't exist
} else {
let u_id = preferences.object(forKey: uid) as! String
print(u_id)
let acc_tkn = preferences.object(forKey: acctkn) as! String
print(acc_tkn)
let userprofile: [String : Any] = ["user_id":u_id,"access_token":acc_tkn]
print(userprofile)
Alamofire.request(userDetails, method: .post, parameters: userprofile).responseJSON { response in
print("RESPONSE : \(response)")
let result = response.result.value
if result != nil{
let data = result as! [String : AnyObject]
let userdata = data["data"] as! NSDictionary
let email = userdata["email"]
let name = userdata["name"]
let photo = userdata["photo"]
//let u_type = userdata["user_type"]!
self.lblUserName.text = name as? String
self.lblEmailID.text = email as? String
let proimgurl = NSURL(string: photo as! String)
self.imgProPic.image = UIImage(data: NSData(contentsOf: proimgurl! as URL)! as Data)
// }
}
}
}
}
请检查并帮助我 - 这是 API 调用的正确方法还是有其他更好的方法?
因为这条线
self.imgProPic.image = UIImage(data: NSData(contentsOf: proimgurl! as URL)! as Data)
所以你有 almofire 请求加上阻塞主线程直到图像被下载,所以考虑使用异步,自动兑现 SDWebImage
self.imgProPic.sd_setImage(with: proimgurl!, placeholderImage: UIImage(named: "placeholder.png"))
同样在 swift 中避免使用 NS 类似这里的东西
let userdata = data["data"] as! NSDictionary // use [String:Any]
和
let proimgurl = NSURL(string: photo as! String) // use URL
您应该从另一个线程的 Url 下载 ImageView 的图像。如果您在主线程中执行此操作,它会减慢您的应用程序并最终 运行 内存不足。
下面给出的行是导致问题的原因如下
self.imgProPic.image = UIImage(data: NSData(contentsOf: proimgurl! as URL)! as Data)
我建议您使用 SDWebImage 库。
你可以像下面那样做
let imageUrl = URL(string: photo as! String)
self.imgProPic.image.sd_setImage(with: imageUrl, placeholderImage: UIImage(named: "profile"), options: .refreshCached, completed: nil)
如果这不能解决您的问题,请尝试使用 API 客户端(例如 Postman)调用相同的 Web 服务。如果它花费相同的时间,那么你不能做太多。请 Web 服务开发人员优化性能。
嘿,顺便说一句,还有 alamofire image pod 可用。
https://github.com/Alamofire/AlamofireImage
例如:
将 AlamofireImage 导入您的文件并调用图像 url,如下所示:
Alamofire.request(image_url, method: .get).responseImage(completionHandler: { (response) in
self.your_UIImage_variable.image = response.result.value
})
我正在 iOS (swift) 中调用 API。一切正常,但在大约 40 或 60 秒内获得响应时花费了太多时间。我不知道为什么会这样。让我向您展示我的 API 调用方法:
代码
func userDetailAPI(){
let preferences = UserDefaults.standard
let uid = "u_id"
let acctkn = "acc_tkn"
if preferences.object(forKey: uid) == nil {
// Doesn't exist
} else {
let u_id = preferences.object(forKey: uid) as! String
print(u_id)
let acc_tkn = preferences.object(forKey: acctkn) as! String
print(acc_tkn)
let userprofile: [String : Any] = ["user_id":u_id,"access_token":acc_tkn]
print(userprofile)
Alamofire.request(userDetails, method: .post, parameters: userprofile).responseJSON { response in
print("RESPONSE : \(response)")
let result = response.result.value
if result != nil{
let data = result as! [String : AnyObject]
let userdata = data["data"] as! NSDictionary
let email = userdata["email"]
let name = userdata["name"]
let photo = userdata["photo"]
//let u_type = userdata["user_type"]!
self.lblUserName.text = name as? String
self.lblEmailID.text = email as? String
let proimgurl = NSURL(string: photo as! String)
self.imgProPic.image = UIImage(data: NSData(contentsOf: proimgurl! as URL)! as Data)
// }
}
}
}
}
请检查并帮助我 - 这是 API 调用的正确方法还是有其他更好的方法?
因为这条线
self.imgProPic.image = UIImage(data: NSData(contentsOf: proimgurl! as URL)! as Data)
所以你有 almofire 请求加上阻塞主线程直到图像被下载,所以考虑使用异步,自动兑现 SDWebImage
self.imgProPic.sd_setImage(with: proimgurl!, placeholderImage: UIImage(named: "placeholder.png"))
同样在 swift 中避免使用 NS 类似这里的东西
let userdata = data["data"] as! NSDictionary // use [String:Any]
和
let proimgurl = NSURL(string: photo as! String) // use URL
您应该从另一个线程的 Url 下载 ImageView 的图像。如果您在主线程中执行此操作,它会减慢您的应用程序并最终 运行 内存不足。
下面给出的行是导致问题的原因如下
self.imgProPic.image = UIImage(data: NSData(contentsOf: proimgurl! as URL)! as Data)
我建议您使用 SDWebImage 库。
你可以像下面那样做
let imageUrl = URL(string: photo as! String)
self.imgProPic.image.sd_setImage(with: imageUrl, placeholderImage: UIImage(named: "profile"), options: .refreshCached, completed: nil)
如果这不能解决您的问题,请尝试使用 API 客户端(例如 Postman)调用相同的 Web 服务。如果它花费相同的时间,那么你不能做太多。请 Web 服务开发人员优化性能。
嘿,顺便说一句,还有 alamofire image pod 可用。 https://github.com/Alamofire/AlamofireImage
例如: 将 AlamofireImage 导入您的文件并调用图像 url,如下所示:
Alamofire.request(image_url, method: .get).responseImage(completionHandler: { (response) in
self.your_UIImage_variable.image = response.result.value
})