Проблемы с вызовом API, занимающего слишком много времени для получения ответа - PullRequest
0 голосов
/ 25 сентября 2018

Я звоню API в iOS (swift).Все работает отлично, но это занимает слишком много времени при получении ответа примерно 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 или есть какой-либо другой, лучше?

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Вы должны загрузить изображение ImageView с Url в другой теме.Если вы сделаете это в главном потоке, это замедлит работу вашего приложения и в конечном итоге не хватит памяти.

Ниже приведена строка, которая вызывает проблему ниже

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.Если это занимает столько же времени, то вы ничего не можете с этим поделать.Попросите разработчика веб-службы оптимизировать производительность.

0 голосов
/ 25 сентября 2018

Привет, кстати, есть также пакет изображений с alamofire.https://github.com/Alamofire/AlamofireImage

например: do импортировать AlamofireImage в ваш файл и вызвать URL-адрес изображения, как показано ниже:

Alamofire.request(image_url, method: .get).responseImage(completionHandler: { (response) in
                        self.your_UIImage_variable.image = response.result.value
                    })
0 голосов
/ 25 сентября 2018

Из-за этой строки

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"))

Также в кратчайшие сроки избегайте использования NS , как здесь

let userdata = data["data"] as! NSDictionary // use [String:Any]

и

let proimgurl = NSURL(string: photo as! String) // use URL
...