2017-12-03 4 views
0

私は、HTTP Post Requestsの関数とtask.resumeのハンドルの順番で迅速に失われてしまいました。POST Request Swiftからメインクラスの変数にデータを戻す

私のクラスには "siteList"という変数があります。 JSONデータをsiteList配列に取り込む関数を実行しようとしています。 JSONデータはPOST REQUESTからのものです。

  1. 私はURLSession要求内のサイトリストにアクセスすることはできません。

    私が午前問題は、ということです。 self.siteListとして割り当てる必要があります。self.siteListは、クラスレベルのsiteListに値を渡しません。

  2. すぐにファイルレベルで宣言されているので、関数の外でsiteData変数を使用することができますが、問題は私が関数の順序を正しく取得できないようです。つまり、task.resume()の後にsiteDataを出力しようとすると、空の値が返されます。

私はこれを2つの機能、1つはプロセスPOSTリクエストを取得し、もう1つはsiteDataをsiteList変数に渡して補完ハンドラを使用するようにしました。しかし問題は2番目の関数が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() 
    } 
} 

答えて

0

ここでの問題:私は、コードは次のようになります。..任意の助けをいただければ幸いです...

をこれに時間を費やしてきたし、解決策を見つけるように見えることはできませんdoステートメントの中に空のsiteListアレイを作成するたびに、self.siteList = [Site]()というコードを削除しても問題ありません。

+0

ありがとうございました!私はあなたのヒントでこれが今働いている! – Judy

+0

ちょっと@Judy答えをアップしてください、ありがとう! –

関連する問題