Tôi đã tạo một lớp tiện ích trong dự án Swift của mình để xử lý tất cả các yêu cầu và phản hồi REST. Tôi đã xây dựng một API REST đơn giản để tôi có thể kiểm tra mã của mình. Tôi đã tạo một phương thức lớp cần trả về một NSArray nhưng vì lệnh gọi API không đồng bộ nên tôi cần trả về từ phương thức bên trong lệnh gọi không đồng bộ. Vấn đề là async trả về void. Nếu tôi đang làm điều này trong Node, tôi sẽ sử dụng JS hứa hẹn nhưng tôi không thể tìm ra giải pháp hoạt động trong Swift.
import Foundation
class Bookshop {
class func getGenres() -> NSArray {
println("Hello inside getGenres")
let urlPath = "http://creative.coventry.ac.uk/~bookshop/v1.1/index.php/genre/list"
println(urlPath)
let url: NSURL = NSURL(string: urlPath)
let session = NSURLSession.sharedSession()
var resultsArray:NSArray!
let task = session.dataTaskWithURL(url, completionHandler: {data, response, error -> Void in
println("Task completed")
if(error) {
println(error.localizedDescription)
}
var err: NSError?
var options:NSJSONReadingOptions = NSJSONReadingOptions.MutableContainers
var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: options, error: &err) as NSDictionary
if(err != nil) {
println("JSON Error \(err!.localizedDescription)")
}
//NSLog("jsonResults %@", jsonResult)
let results: NSArray = jsonResult["genres"] as NSArray
NSLog("jsonResults %@", results)
resultsArray = results
return resultsArray // error [anyObject] is not a subType of 'Void'
})
task.resume()
//return "Hello World!"
// I want to return the NSArray...
}
}