Alamofire - 如何获取表中的记录数
Posted
技术标签:
【中文标题】Alamofire - 如何获取表中的记录数【英文标题】:Alamofire - how to get the number of records in the table 【发布时间】:2018-03-17 05:48:54 【问题描述】:我有这个代码:
func downloadDataRanking(completed: @escaping () -> ())
Alamofire.request(rankingGroupUrlToShow, method: .get, parameters: nil)
.responseJSON response in
let jsonResponse = JSON(response.result.value!)
if (jsonResponse.isEmpty || jsonResponse != "")
if(jsonResponse["ranking"]["grupy"].count > 0)
let grupy = jsonResponse["ranking"]["grupy"].array
if (grupy!.count > 0)
for i in 0...(grupy?.count)! - 1
var tablicaGraczy = 0
if (grupy![i]["grupy"].array != nil)
tablicaGraczy = grupy![i]["grupy"].array?.count // ilość graczy @@@@ tu jest problem
let graczeRankingu = grupy![i]["grupy"].array
print("graczeRankingu: \(graczeRankingu)")
if tablicaGraczy > 0
DispatchQueue.main.async // watek od rysowania interface
for ii in 0...(tablicaGraczy) - 1
print("GRACZ: \(graczeRankingu![ii]["czasGry"]) ii \(graczeRankingu![ii]["liczbaZdobytychPunktow"]) ii \(graczeRankingu![ii]["email"]) ii \(graczeRankingu![ii]["zdjecieZFacebooka"]) ii \(graczeRankingu![ii]["imieINazwisko"]) ii \(graczeRankingu![ii]["dataZdobyciaPunktow"]) ii \(graczeRankingu![ii]["zakonczonaGra"]) ii ")
var dataZdobyciaPunktow = ""
if (graczeRankingu![ii]["dataZdobyciaPunktow"]["year"].int != nil)
dataZdobyciaPunktow = "\(graczeRankingu![ii]["dataZdobyciaPunktow"]["dayOfMonth"].int!).\(graczeRankingu![ii]["dataZdobyciaPunktow"]["month"].int!).\(graczeRankingu![ii]["dataZdobyciaPunktow"]["year"].int!)"
var imieINazwisko = ""
if (graczeRankingu![ii]["imieINazwisko"].string?.isEmpty == false)
imieINazwisko = graczeRankingu![ii]["imieINazwisko"].string!
var zdjecieZFacebooka = ""
if (graczeRankingu![ii]["zdjecieZFacebooka"].string?.isEmpty == false)
zdjecieZFacebooka = graczeRankingu![ii]["zdjecieZFacebooka"].string!
var email = ""
if (graczeRankingu![ii]["email"].string?.isEmpty == false)
email = graczeRankingu![ii]["email"].string!
var liczbaZdobytychPunktow = ""
if (graczeRankingu![ii]["liczbaZdobytychPunktow"].string?.isEmpty == false)
liczbaZdobytychPunktow = graczeRankingu![ii]["liczbaZdobytychPunktow"].string!
var czasGry = ""
if (graczeRankingu![ii]["czasGry"].string?.isEmpty == false)
czasGry = graczeRankingu![ii]["czasGry"].string!
print("WYNIKI: \(self.items)")
completed()
上面的代码有: a) 使用 Alamofire 从选定的 URL 下载数据 b) 检查下载的表是否为空 c) 将下载的值保存到变量中
我对这段代码有疑问:
var tablicaGraczy = 0
if (grupy![i]["grupy"].array != nil)
tablicaGraczy = grupy![i]["grupy"].array?.count
我收到一条错误消息:可选类型“Int?”的值未拆封;你的意思是用'!'还是“?”?
这段代码是检查记录数是否有数组——如果为空则赋值为0
顺便说一句。您是否写入变量:imieINazwisko、zdjecieZFacebooka、电子邮件、liczbaZdobytychPunktow、czasGry - 您的意见是否正确?您知道更好的解决方案吗?
【问题讨论】:
您的响应是字典还是数组?如果不是私人的,您可以发布您的回复或分享您的网址吗?此外,您不应强制展开 (!),而应使用 if let 或 guard let。 是的,这是我的 json:serwer1356363.home.pl/pub/json.php。你在说什么展开? 【参考方案1】:为了更好的做法,不要仅在请求方法中进行 JSON 解析,您应该在完成块中传递响应并在那里执行操作。
另外,阅读如何使用 if let/guard let 解包。 :https://medium.com/@abhimuralidharan/if-let-if-var-guard-let-and-defer-statements-in-swift-4f87fe857eb6
这是 APIHelper 类:
import UIKit
import Alamofire
class APIHelper: NSObject
func downloadDataRanking(completion: @escaping ([String: Any], Bool) -> ())
guard let requestUrl = URL.init(string: "http://serwer1356363.home.pl/pub/json.php") else return
Alamofire.request(requestUrl, method: .get, parameters: nil)
.responseJSON response in
switch response.result
case .success:
let statusCode: Int = (response.response?.statusCode)!
switch statusCode
case 200:
if let json = response.result.value as? [String: Any]
completion(json, true)
break
default:
completion([String: Any](), false)
break
break
case .failure:
completion([String: Any](), false)
break
在你的控制器中调用这个函数:
func fetchData()
APIHelper().downloadDataRanking (response, success) in
if success
print("SUCCESS : downloadDataRanking")
if !response.isEmpty
if let ranking = response["ranking"] as? [String: Any], let grupy = ranking["grupy"] as? [[String: Any]], !grupy.isEmpty
print("ranking : \(ranking)")
print("grupy : \(grupy)")
for object in grupy
if let gracze = object["gracze"] as? [[String: Any]], !gracze.isEmpty
for objectGracze in gracze
print("objectGracze : \(objectGracze)")
if let zdjecieZFacebooka = objectGracze["zdjecieZFacebooka"] as? String, let email = objectGracze["email"] as? String, let czasGry = objectGracze["czasGry"] as? String
print("zdjecieZFacebooka : \(zdjecieZFacebooka)")
print("email : \(email)")
print("czasGry : \(czasGry)")
if let dataZdobyciaPunktow = objectGracze["dataZdobyciaPunktow"] as? [String: Any]
print("dataZdobyciaPunktow : \(dataZdobyciaPunktow)")
if let year = dataZdobyciaPunktow["year"] as? Int, let month = dataZdobyciaPunktow["month"] as? Int
print("year : \(year)")
print("month : \(month)")
else
print("ERROR : downloadDataRanking")
在此函数中,您可以获取所有 JSON 值。例如,我正在获取排名、grupy、zdjecieZFacebooka、电子邮件和 czasGry。
【讨论】:
额外 :) sharad chauhan - 它正在工作 :) 你能告诉我如何适应你的代码,在这种 json 的情况下:serwer1356363.home.pl/pub/json2.php - 变量 dataZdobyciaPunktow 并显示它? @ŁukaszBetta 更新了答案。但是您应该了解它是如何完成的。以上是关于Alamofire - 如何获取表中的记录数的主要内容,如果未能解决你的问题,请参考以下文章