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,编码问题