你不能異步網絡請求的封閉內使用return
,你必須改用回調。
您從請求需要一個NSMutableArray的,所以首先,讓我們爲這個回調:
completion: (array: NSMutableArray)->()
我們這個回調添加到方法簽名:
func getJSON(completion: (array: NSMutableArray)->())
然後在陣列將可用的位置,我們將此完成處理程序放置在:
class CompanyModel {
func getJSON(completion: (array: NSMutableArray)->()) {
let companyArray: NSMutableArray = NSMutableArray()
let requestURL: NSURL = NSURL(string: "http://localhost/Companies/JSON.php")!
let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(urlRequest) {
(data, response, error) -> Void in
let httpResponse = response as! NSHTTPURLResponse
let statusCode = httpResponse.statusCode
if (statusCode == 200) {
do{
let json = try NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments)
if let companies = json["companies"] as? [[String: AnyObject]] {
for company in companies {
if let name = company["name"] as? String,
let phoneNumber = company["phone_number"] as? String,
let website = company["website"] as? String,
let email = company["email"] as? String,
let address = company["address"] as? String {
let company = CompanyModel()
company.name = name
company.phoneNumber = phoneNumber
company.website = website
company.email = email
company.address = address
companyArray.addObject(company)
}
}
// CALLBACK HERE
completion(array: companyArray)
}
} catch {
print("Error with Json: \(error)")
}
}
}
task.resume()
}
}
我們得到來自網絡的陣列我們使用尾隨封這樣的:
getJSON { (array) in
print(array)
}
正是我在後,但由於某種原因,我的'變種arraySource = NSMutableArray的()'是空的。如果我在'task.resume()'的同一個括號內打印(companyArray)',那麼'companyArray'是空的。儘管如此,如果我之前打印了一個支架,出於某種原因它會打印完整陣列。不知道爲什麼數組被刪除 – luke
@luke嘗試在func getJSON之後定義你的數組:let companyArray:NSMutableArray = NSMutableArray()'我想這是因爲你的數組是在特定的括號中定義的,所以在編譯器完成該塊,它從內存中刪除所有的數組! – AaoIi
我其實已經在我的代碼中做過 - 只是編輯了問題(我認爲這就是你的意思)。我還添加了print語句的作用和不起作用。 – luke