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 - 如何获取表中的记录数的主要内容,如果未能解决你的问题,请参考以下文章

如何从mysql中的表中选择N条记录

如何获取 Lua 表中的条目数?

如何获取SQL表中的下一条记录

如何从左表中仅获取一条记录与右表中的每条记录

在mongo中如何通过总记录获取表中记录的当前位置进行分页?

如何使用sql从具有不同列的两个表中获取不同的记录