Swift 3 / Alamofire 4:在 TableView 上使用 ID 获取数据

Posted

技术标签:

【中文标题】Swift 3 / Alamofire 4:在 TableView 上使用 ID 获取数据【英文标题】:Swift 3 / Alamofire 4: Fetching data with the ID on a TableView 【发布时间】:2017-06-30 03:15:13 【问题描述】:

我正在尝试使用 ViewController 上的 ID 获取数据。我有两个视图控制器,当我按下 Cell(来自 ViewController 1)时,它有一个 ID 并转到 ViewController 2 并获取分配给 ID 的所有记录。例如,在 ViewController 1 上,我有一个 UITableView 并且有 20 个单元格。每个单元格都有一个从数据库动态分配给它的 ID。当我按下单元格时,假设我按下了第 9 个单元格并且它的 ID 是 99,然后它会转到 ViewController 2 并获取所有外键 ID 为 99 的记录。

请在下面找到我的 ViewController 2 代码:

import UIKit
import Alamofire
import SwiftyJSON


class CategoryViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, NSURLConnectionDelegate 

var tableData = Array<Category>()
var arrRes = [[String:AnyObject]]() //Array of dictionary
var category = [Category]()
var catTitle = ""
var id = ""



@IBOutlet weak var catTitleRec: UILabel!

@IBOutlet weak var tableview: UITableView!




override func viewDidLoad() 
    super.viewDidLoad()

    catTitleRec.text = catTitle
    loadCategories()


func loadCategories()

    let testhappyhour:Category = Category(tempName: "category.NAME", tempID: "category.id",  tempgbcount: "TOTAL")
    self.category.append(testhappyhour)

    let postID = "id="+id

    print("Response ID-is: \(postID)") // Able to get the ID here

    Alamofire.request("http://www.URL.com.au/database/results.php").responseJSON
         response in switch response.result 
        case .success(let JSON):
            let response = JSON as! NSArray
            print("Response: \(response)")
            for item in response  // loop through data items
                let obj = item as! NSDictionary
                let happyhour = Category(tempName:obj["category.NAME"] as! String, tempID:obj["category.id"] as! String,  tempgbcount:obj["TOTAL"] as! String)
                self.category.append(happyhour)
                self.arrRes.append(obj as! [String : AnyObject]) // ADD THIS LINE
            
            self.tableview.reloadData()

        case .failure(let error):
            print("Request failed with error: \(error)")
            
    


override func viewDidAppear(_ animated: Bool) 
    super.viewDidAppear(animated)
    tableview.reloadData()


override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    //return myarray.count
    return arrRes.count


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "groupCell") as! GroupCellTableViewCell
    var dict = arrRes[indexPath.row]

    cell.nametextlabel.text = dict["category.NAME"] as? String
    cell.totaltextlabel?.text = dict["TOTAL"] as? String

    return cell





感谢您的时间和精力:)

【问题讨论】:

您面临什么问题?它是否在第二个 viewController 上显示数据?还是没有在控制器 1 上获取 id? @iosGeek ,我无法获取数据。我可以在 ViewController 2 上看到与其关联的 ID。我想查看所有具有 ID 的相关数据,例如; 99 您在日志中得到什么错误响应?是不是你在 alamofire 中的 api 甚至没有被击中,只是出现错误,如代码响应 (-1) @iOSGeek 我现在可以在输出框中看到数据,但是它崩溃了 我得到的错误是线程 1:信号 SIGABRT 【参考方案1】:
func loadCategories(id : String) 


    let userDic : [String : AnyObject] = ["id":id as AnyObject]

      Alamofire.upload(multipartFormData:  multipartFormData in

        for (key, value) in userDic 
            multipartFormData.append(value.data(using: String.Encoding.utf8.rawValue)!, withName: key)
        

    ,to: "http://www.URL.com.au/database/results.php" , method: .post, headers: nil ,
      encodingCompletion:  encodingResult in
        switch encodingResult 
        case .success(let upload, _, _):
            upload.response  [weak self] response in
                guard self != nil else 
                    return
                
                debugPrint(response)

            

            upload.responseJSON   response in

                print(response)
                let responseJSON = response.result.value as! NSDictionary


                print(responseJSON)



            

        case .failure(let encodingError):
            print("error:\(encodingError)")
        


    )

使用您在 ViewDidLoad 中的 ID 调用此函数

loadCategories(id:id)

【讨论】:

首先从 didselect 方法 viewcontroller 1 到 Viewcontroller 2 传递 Id 然后在 viewcontroller2 中调用这个 loadCategories(id:id) 你肯定会得到结果 嗨 Bhavik,我尝试了代码,但它没有根据 ID 获取任何记录。 我可以在输出面板中看到从 ViewController 1 传递到 ViewController 2 的 ID 但我猜它崩溃了【参考方案2】:

制作一个 Swift 文件并将此代码放入 APi.swift

APi.swift

    import Foundation

    import Alamofire


    class APIClient 

    internal typealias CompletionBlock = (_ data:NSDictionary?,_ error:NSError?) -> Void

         fileprivate class func executePostAPICallWithMethod(_ method:String ,withParameters parameters:AnyObject?, callback:@escaping CompletionBlock) 

                let str = method


                Alamofire.request(str, method: .post, parameters: parameters as? [String : AnyObject], encoding: JSONEncoding.default).responseJSON  response in
                    switch response.result 
                    case .success(let JSON):
                        //                    print("Success with JSON: \(JSON)")
                        print("Request failed with error: \(response.response?.statusCode)")

                        let response = JSON as! NSDictionary

                        callback(response,nil)
                        break

                    case .failure(let error):
                        print("Request failed with error: \(error)")
                        callback(response.result.value as? NSMutableDictionary,error as NSError?)
                        break
                    
                    
                    .responseString  response in
                        print("Response String: \(response.result.value)")
                

            

          class func loadCategories(_ detail : [String : AnyObject],completion:@escaping CompletionBlock)

                let strMethod = String(format : "http://www.URL.com.au/database/results.php" )
                self.executePostAPICallWithMethod(strMethod, withParameters: detail as AnyObject?)  (data, error) -> Void in
                    completion(data,error)
                
            

    

在 ViewController 2 中在 ViewDidLoad 中调用这个函数

func loadCategories(id : String)

 let userDic : [String : AnyObject] = ["id":id as AnyObject]

        APIClient.loadCategories(userDic,completion: (data, error)->Void in
            if((error) != nil) 

                if((data) != nil)


                 else 

                
             else 

                print(data as Any)



                //self.tableview.reloadData()
            

        )


【讨论】:

让我知道它是否有效?如果有任何疑问,请告诉我 不,它失败了 收到此错误:请求失败并出现错误:responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(Error Domain=NSCocoaErrorDomain Code=3840 "字符 2 周围的值无效。" 但它确实适用于您之前发布的回复 但它崩溃了:(

以上是关于Swift 3 / Alamofire 4:在 TableView 上使用 ID 获取数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 3 和 Alamofire 4 后没有得到响应

如何在 Alamofire 4 和 Swift 3 中设置方法、标题、参数

Swift 3 的 ObjectMapper 和 Alamofire 问题 Alamofire 4 的 Alamofire 版本

在 Swift 3 中从 URLSession 迁移到 Alamofire 4.3,编码问题

Alamofire 4 swift 3 上传带有标题的 MultipartFormData 未发布

如何使用参数 swift 3.0 Alamofire 4.0 调用邮政服务?