Alamofire 一般要求

Posted

技术标签:

【中文标题】Alamofire 一般要求【英文标题】:Alamofire general request 【发布时间】:2018-11-21 21:02:09 【问题描述】:

你能帮我解决这个问题吗

我正在尝试使用 Alamofire 从 API 中提取数据。是否可以在同一个请求中提取 ["title"] 和 Image 等简单数据并将其填充到表格视图中?

这是我的代码:

Alamofire.request(baseURL).responseJSON  (response) in
        switch response.result 
        case .success:
            if let value = response.result.value
                let json = JSON(value)
                json.forEach( (temp) in
                    let title = temp.1["title"].stringValue
                    let run = temp.1["run"].stringValue
                    let image = temp.1["thumb"].stringValue
                    let newmodel = Schedule(title: title, run: run, image: image)
                    self.scheduleArray.append(newmodel)
                )

            
        case .failure(let error):
            print(error.localizedDescription)
        
        DispatchQueue.main.async 
            self.tableView.reloadData()
        
    

【问题讨论】:

“是否可以提取简单的数据,例如” - 是的,HTTP 服务器可以生成的任何内容,您都可以使用 - 这引发了问题,服务器响应什么和?您似乎试图解析一些 JSON,服务器是否返回 JSON 响应?您的问题是笼统的,并不指向特定的问题或问题。您是否使用了以前的方法 (URLSession?) 有效,而这不是?您与哪个 URL 通信?输入和预期输出是什么?您在解析结果或填充表格时遇到问题吗? 哦,不,我在填充数据方面没有问题。我只是想为简单的对象和图像数据编写 1 个 Alamofire 请求 所以你有两个请求,它们返回不同的数据集,你想要一些如何组合它们? 是的,像 Alamofire.request(baseURL).response (response, error, data) in 这可能超出了您的意图范围,但我会考虑看起来像“PromiseKit”或“Hydra”这样的东西,它可以管理两个异步操作的执行,并且以一种更优雅的方式,除了使用一堆信号量和其他锁定/通知机制......只是说 【参考方案1】:

您可以先获取基础数据,然后通过单个请求获取每个图像

使用此代码获取基础数据:

 func POSTWithLoad(urlString: String,paramaters: [String: AnyObject]? = nil,success:@escaping (_ responseObject: AnyObject?) -> Void ,failure: @escaping (_ error: String?) -> Void ) 

 Alamofire.request(baseUrlDev+urlString, method: .post, parameters:paramaters, encoding: URLEncoding.default, headers: headers).responseJSON(completionHandler:  (responseData) in

            if (responseData.result.error == nil && responseData.result.isSuccess == true) 

            //success

             success(responseData)

             else 

            //fauiler

            failure("UnKnowen Data")

            

     )

并将其用于 getImage :

func getImage(link : String , completion : @escaping (_ imageWithLink : (link : String,image : UIImage)) -> Void)
    var image = UIImage(named: "placeholder")

    URLSession.shared.dataTask(with: NSURL(string: link.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)! as URL, completionHandler:  (data, response, error) -> Void in
        if error != nil 
            print("errorLoadIamge : "+link)
            //completion(image)
            print(error)
            return
        
        DispatchQueue.main.async(execute:  () -> Void in
            let mimage = UIImage(data: data!)
            if(mimage != nil)
                image = mimage!
                completion((link : link , image : image))
                print("successLoadIamge : "+link)
                return
            
        )

    ).resume()

然后可以像这样在 ViewContoller 中使用它:

    let products : [Product] = []
    let productImages : [String] = []

POSTWithLoad(urlString: "YApiLink" , paramaters: requestParameters as [String : AnyObject]?, success:  (successObject) in

            products = Mapper<Product>().mapArray(JSONObject : successObject)
            productsImages = []
            print(successObject)

        , failure : (failureObject) in

            print(failureObject)

        
        )


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

        let product = products[indexPath.row]   
     let cell =  YourTableView.dequeueReusableCell(withIdentifier: "CellIdentifier", for: indexPath) as! YourTableViewCell

        if let imageAndLink = productsImages.first(where:  $0.link == cell.product?.productImage)
        cell.pImage?.image = imageAndLink.image
        else cell.pImage.image =  UIImage(named: "placeholder")
            getImage(link: cell.product?.productImage ?? "", completion: (newImage) in

                DispatchQueue.main.async 
                    if self.productsImages.first(where:  $0.link == newImage.link) == nil
                    
                        self.productsImages.append(ProductImage(link : newImage.link , image : newImage.image) )
                    
                    if cell.product?.productImage == newImage.link
                        cell.pImage.image = newImage.image
                    
                

            )
        

【讨论】:

非常感谢

以上是关于Alamofire 一般要求的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire+HandyJSON+泛型封装的简单离散式网络框架

Alamofire 请求为零

Alamofire 上传进度

测试iPhone时Alamofire安装问题

Alamofire - 检测互联网连接

Alamofire 发布请求未执行