2016-08-30 37 views
0

我已經搜索瞭如何做到這一點,但是對我而言,某些事情沒有意義,我無法做到。我需要做的就是從我的json會話中獲取數據(如果這就是你所說的)。我約3周前開始編程,所以我需要非專業術語。我意識到這可能會被標記爲重複,但這個/相關主題上的大部分答案都是針對其他語言的,我很快就不瞭解它們,所以它們對我沒有多大幫助。從json會話返回的值在會話之外使用

我花了幾個小時試圖找到答案,因爲我是新的,我不知道我正在尋找什麼,甚至是正確的事情要搜索。我也嘗試閱讀iOS開發者庫,但是我不明白它告訴我什麼,或者我沒有找到正確的部分,因爲我仍然無法弄清楚。請嘗試解釋這一點,而不是發送給我閱讀其他資源。

這裏是我的功能

func parseData() { 

let urlString = "http://heroesjson.com/heroes.json" 
let session = NSURLSession.sharedSession() 
let url = NSURL(string: urlString)! 

session.dataTaskWithURL(url) { (data: NSData?, response:NSURLResponse?, error: NSError?) -> Void in 

    guard let responseData = data else { return } 
    var json: [[String: AnyObject]]! 

    do { 
     json = try NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.AllowFragments) as! [[String: AnyObject]] 
    } 
    catch { 
     //handle error 
    } 

    var arrayToReturn = [Hero]() 
    for element in json { 
     let hero = Hero(fromDictionary: element as! [String: AnyObject]) 
     arrayToReturn.append(hero) 
    } 
    }.resume()//Closes Session.dataTaskWithURL 
} //Closes parseData() 

的目標是讓json的變量在我做發言,所以我可以解析它的功能之外,或讓我的「arrayToReturn」這樣我就可以把它保存到全球我使用的變量。

如果我理解正確,我不能只將值(arrayToReturn)賦值給我的全局變量(英雄),因爲這是一個異步請求,所以它只返回nil,因爲在請求完成之前調用該命令。我想我必須使用完成處理程序或回調函數。我真的不明白他們之間的區別,不明白如何其中來執行它們。

另外,我也不太瞭解這個代碼,我只是知道有必要得到我想要的。

session.dataTaskWithURL(url) { (data: NSData?, response:NSURLResponse?, error: NSError?) -> Void in 

「(數據:NSData的?迴應:NSURLResponse?錯誤:NSError)」的模樣參數,但他們似乎沒有被連接到一個函數,這樣沒有意義對我

「 - >無效」對我來說沒有意義,因爲 - >表示返回任何後面的東西,但是無效表示它沒有返回,所以爲什麼不把它們全部放在一起呢? 「

」 - >虛假in「這裏的意義是什麼?這是什麼意思/信號?

回答

1

去看看吧Swift Closures。要在它之外使用一個值,你需要將它傳遞給另一個閉包。

func parseData(callback: (heroes: [Hero]) -> Void) { 

let urlString = "http://heroesjson.com/heroes.json" 
let session = NSURLSession.sharedSession() 
let url = NSURL(string: urlString)! 

session.dataTaskWithURL(url) { (data: NSData?, response:NSURLResponse?, error: NSError?) -> Void in 
    guard let responseData = data else { return } 
    var json: [[String: AnyObject]]! 

    do { 
     json = try NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.AllowFragments) as! [[String: AnyObject]] 
    } 
    catch { 
     //handle error 
    } 

    var arrayToReturn = [Hero]() 
    for element in json { 
     let hero = Hero(fromDictionary: element as! [String: AnyObject]) 
     arrayToReturn.append(hero) 
    } 

    callback(heroes: arrayToReturn) 
    }.resume()//Closes Session.dataTaskWithURL 
} //Closes parseData() 

而且就叫做:

parseData { heroes in 
    // do something with the array 
} 
+0

我整節今天早些時候讀了,我還是不明白怎麼做我要問什麼......這就是爲什麼我使出在這裏問。如果你可以更具體地說明哪一部分可能有幫助。 – Apple

+0

我編輯了我的回覆,也許現在有意義。如果有幫助,請確保將其標記爲最佳答案。謝謝。 – itsProf

+0

謝謝!我編輯了我的代碼,它的工作原理。我只需要知道如何在程序開始之前運行這段代碼,然後纔開始執行它,因爲程序需要從此json解析中填充的所有數據 – Apple