Ios 如何将NSURLRequest的结果传回包含类
我从API收集了Ios 如何将NSURLRequest的结果传回包含类,ios,swift,task,Ios,Swift,Task,我从API收集了JSON数据,并且能够初始化我的数组(类实例变量),但是在块之后,数据从数组中被销毁。如何从任务块返回可用于初始化阵列的数据 override func viewDidLoad() { // var movies=[Movie]() let requestURL: NSURL = NSURL(string: "https://yts.ag/api/v2/list_movies.json")! let urlRequest: NSMutableURLReq
JSON
数据,并且能够初始化我的数组(类实例变量),但是在块之后,数据从数组中被销毁。如何从任务块返回可用于初始化阵列的数据
override func viewDidLoad() {
// var movies=[Movie]()
let requestURL: NSURL = NSURL(string: "https://yts.ag/api/v2/list_movies.json")!
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) {
print("File downloaded successfully.")
do {
let jsonYts = try NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments)
let jsonDataTag = jsonYts["data"]
let jsonMovie = jsonDataTag!!["movies"]!
let movies = [Movie].fromJSONArray(jsonMovie as! [JSON])
// self.moviesList = movies as! [Movie] // this is my array. I want to add data to it
for data in self.moviesList {
// print(data.title)
}
} catch {
}
}
}
task.resume()
}
异步方法不会返回到调用函数,因为它们一开始不会被直接调用。它们被放置在稍后调用的任务队列中(在不同的线程上!)。对于那些刚接触异步编程的人来说,这是最难掌握的。异步方法必须改变类变量。因此,您将有:
class MyContainer: UIViewController {
var myInstanceData: [SomeObject] // In your case moviesList
func startAsyncRequest() { // In your case viewDidLoad()
// In your case NSMutableURLRequest
doSomethingAsynchronous(callback: { [weak self] (result) in
// in your case JSON parsing
self?.myInstanceData = parseResult(result) // share it back to the containing class
// This method returns nothing; it is not called until well
// after startAsyncRequest() has returned
})
}
}
回调完成后,myInstanceData
可用于类中的所有其他方法。作为一般模式,这有意义吗
之后,您必须学习以下内容:
从运行回调的后台线程将结果返回UI
附录
为了清晰起见,在编辑问题后再看一看,似乎您已经知道这一点,但您已经注释掉了正确的行,如果您将其放回,事情就正常了,也就是说,电影不会被销毁,而是会记录在类属性moviesList
中
// self.moviesList = movies as! [Movie] // this is my array. I want to add data to it
为什么不重新启用它呢也许真正的问题是:你的意思是附加而不是覆盖吗?那么答案可能很简单:
self.moviesList += movies as! [Movie]
异步方法不会返回到调用函数,因为它们一开始不会被直接调用。它们被放置在稍后调用的任务队列中(在不同的线程上!)。对于那些刚接触异步编程的人来说,这是最难掌握的。异步方法必须改变类变量。因此,您将有:
class MyContainer: UIViewController {
var myInstanceData: [SomeObject] // In your case moviesList
func startAsyncRequest() { // In your case viewDidLoad()
// In your case NSMutableURLRequest
doSomethingAsynchronous(callback: { [weak self] (result) in
// in your case JSON parsing
self?.myInstanceData = parseResult(result) // share it back to the containing class
// This method returns nothing; it is not called until well
// after startAsyncRequest() has returned
})
}
}
回调完成后,myInstanceData
可用于类中的所有其他方法。作为一般模式,这有意义吗
之后,您必须学习以下内容:
从运行回调的后台线程将结果返回UI
附录
为了清晰起见,在编辑问题后再看一看,似乎您已经知道这一点,但您已经注释掉了正确的行,如果您将其放回,事情就正常了,也就是说,电影不会被销毁,而是会记录在类属性moviesList
中
// self.moviesList = movies as! [Movie] // this is my array. I want to add data to it
为什么不重新启用它呢也许真正的问题是:你的意思是附加而不是覆盖吗?那么答案可能很简单:
self.moviesList += movies as! [Movie]
如果API返回JSON数据,您可以使用“SwiftyJson”来处理API的响应;如果它使用XML,则使用“SWXMLHash”。它们都是POD(库),设计用于处理来自各自格式的响应
。如果您仍然有问题,请在下面进行评论
此时,您可以导入SwiftyJson并使用它
让response
为任意对象,并假设您的JSON数据采用以下格式:
{"text": {
"data": "Click Here",
"size": 36,
"style": "bold",
"name": "text1",
"hOffset": 250,
"vOffset": 100,
"alignment": "center"
}
}
然后你就可以这样写代码了
func response(data){
let dt = JSON(data : data) // the second data is the response from api
response = dt.object // for accessing the values as object from json format
let style = response["text"]["data"]!! as? String // style = "bold"
let n = response["text"]["name"]!! as? String // n = "text1"
let size = response["text"]["hOffset"]!! as? Int // size = 250
}
// Done !! Easy.. if you guys need help or snapshots for the same do comment..
如果API返回JSON数据,您可以使用“SwiftyJson”来处理API的响应;如果它使用XML,则使用“SWXMLHash”。它们都是POD(库),设计用于处理来自各自格式的响应
。如果您仍然有问题,请在下面进行评论
此时,您可以导入SwiftyJson并使用它
让response
为任意对象,并假设您的JSON数据采用以下格式:
{"text": {
"data": "Click Here",
"size": 36,
"style": "bold",
"name": "text1",
"hOffset": 250,
"vOffset": 100,
"alignment": "center"
}
}
然后你就可以这样写代码了
func response(data){
let dt = JSON(data : data) // the second data is the response from api
response = dt.object // for accessing the values as object from json format
let style = response["text"]["data"]!! as? String // style = "bold"
let n = response["text"]["name"]!! as? String // n = "text1"
let size = response["text"]["hOffset"]!! as? Int // size = 250
}
// Done !! Easy.. if you guys need help or snapshots for the same do comment..
在我的回答中举个例子:在我的回答中举个例子:我认为这个问题的措辞是误导性的,有两个方向,所以请根据上面答案的哪一部分来澄清。我认为这个问题的措辞是误导性的,有两个方向,所以请根据上面的哪一部分来澄清答案实际上解决了这个问题。