将数据从POST Request Swift传递回主类变量

时间:2017-12-03 00:49:02

标签: swift

我是swift的新手,完全失去了函数的顺序以及HTTP Post请求的task.resume句柄。

所以我有一个名为" siteList"的变量。在我班上 我试图运行一个函数来将JSON数据填充到siteList数组中。 JSON数据来自POST REQUEST。

我遇到的问题是:

  1. 我无法访问URLSession请求中的siteList。它要求我将其指定为self.siteList,它不会将值传递回类级别的siteList。
  2. 我可以在函数外部使用siteData变量,因为它在swift文件级别声明,但问题是我似乎无法使函数顺序正确。换句话说,当我尝试在task.resume()之后打印siteData时,它仍然返回空。
  3. 我尝试将其分为两个函数,一个用于获取进程POST请求并获取siteData,另一个用于将siteData传递给siteList变量,并使用完成处理程序。但问题是第二个函数需要再次成为self.functionName,这基本上使得值在类级别可访问。

    我确信我可能在这里遗漏了一些东西,但我完全迷失了。我花了好几个小时才能找到解决方案......

    任何帮助将不胜感激..

    代码如下所示:

    var siteData = NSArray()
    
    class SiteListManager: NSObject {
        var siteList=[Site]()    
        let category = GlobalConstants.kCat
        let keyword = GlobalConstants.kKeyword
        let latitude = GlobalConstants.kLat
        let longitude = GlobalConstants.kLong
    
        // MARK: - init
        override init() {
            super.init()        
            getSiteList(category: category, keyword:keyword, latitude:latitude, longitude:longitude)
        }
    
        func getSiteList(category: String, keyword: String, latitude: String, longitude: String) {
    
            let myUrl = URL(string: "http://www.goseesa.org.php7-34.ord1-1.websitetestlink.com/sites/list");
            var request = URLRequest(url:myUrl!)
            request.httpMethod = "POST"// Compose a query string
    
            let postString = "keyword="+category+"&cid="+keyword+"&lat="+latitude+"&long="+longitude
            request.httpBody = postString.data(using: String.Encoding.utf8);
    
            let task = URLSession.shared.dataTask(with: request, completionHandler: { (data: Data?, response: URLResponse?, error: Error?) in
                do {
                    siteData = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! NSArray
    
                    let kTotalSites = siteData.count
                    self.siteList = [Site]()
                    // Now we can access value of First Name by its key
                    //let siteList = parseJSON["user"] as? NSDictionary
                    for i in 0..<kTotalSites {
                        let siteContent = siteData[i] as! NSDictionary
                        let name = siteContent.value(forKey: "name") as! String
    
                        //load site information
                        let site = Site(name: name)
                        self.siteList.append(site)
                    }//end of compiling site list
                 }catch {
                        print(error)
                 }
            })
            task.resume()
        }
    }
    

1 个答案:

答案 0 :(得分:0)

这里的问题是,在do语句中,您每次使用siteList创建一个空的self.siteList = [Site]()数组,请从代码中删除它,它应该没问题。