gpt4 book ai didi

swift - 在 NSURLConnection 的 Swift 中从 completionHandler 获取数据

转载 作者:IT王子 更新时间:2023-10-29 05:24:16 26 4
gpt4 key购买 nike

我正在尝试编写一个函数来执行异步 GET 请求,并返回响应(作为任何数据类型,但这里是 NSData)。

这个问题是基于:How to use NSURLConnection completionHandler with swift

func getAsynchData() -> NSData {
var dataOutput : NSData
let url:NSURL = NSURL(string:"some url")
let request:NSURLRequest = NSURLRequest(URL:url)
let queue:NSOperationQueue = NSOperationQueue()

NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
/* this next line gives the below error */
dataOutput = data
})
return dataOutput
}

但是我得到一个错误:

error: variable 'dataOutput' captured by a closure before being initialized

我已经尝试从 completionHandler 返回值,但它需要一个 void 返回,这诡异地提醒我我希望在没有帮助的情况下解决这个问题......:D

我看过: How to use completionHandler Closure with return in Swift?但这并不能真正回答我的问题。我的目标是从我的异步请求中获取数据 block ,以便在我的代码中的其他地方使用。我是否应该在此 block 中完成此请求的所有工作而不取出数据?

谢谢!

编辑

好的,所以我有一个我认为可能有用的选项,但它对我来说似乎不合适。谁能告诉我这是否是实现我的目标的最佳方式?

func doThingsWithData( data: NSData ) -> String {
/* code to extract string from NSData */
return somestring
}
func getAsynchData() {
let url:NSURL = NSURL(string:"some url")
let request:NSURLRequest = NSURLRequest(URL:url)
let queue:NSOperationQueue = NSOperationQueue()

NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
/* this next line gives the below error */
doThingsWithData(data)
})
}

EDIT 2 -> 响应撤消

谢谢,撤消。你的回答对我来说很有意义。这是更多的难题。我有一个类是我的 API 处理程序。我希望能够实例化该类,并对其调用函数以从 API 获取数据。我宁愿通过一次 api 调用获取所有数据,而不是每次都对我需要输出的每个值进行单独调用,因为单个 API 调用包含我需要的所有数据,但这可能是另一个答案。这是代码:

class GetInfoFromAPI {

func getSpecificValue(index : String) -> String {
/* I assume I need to send the values from this function, yea? but how do I get them here? */
}

func doThingsWithData( data: NSData ) -> String {
/* code to extract string from NSData */
var error: NSError?
let jsonDict = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &error) as NSDictionary

specificValue1 : String = jsonDict.valueForKey("value1") as String
specificValue2 : String = jsonDict.valueForKey("value2") as String
specificValue3 : String = jsonDict.valueForKey("value3") as String

/* I want to get these ^^^ values into the ViewController below */
}

func getAsynchData() {
let url:NSURL = NSURL(string:"some url")
let request:NSURLRequest = NSURLRequest(URL:url)
let queue:NSOperationQueue = NSOperationQueue()

NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
/* this next line gives the below error */
doThingsWithData(data)
})
}
}


class ViewController: UIViewController {

@IBOutlet var labelVariable1: UILabel
@IBOutlet var labelVariable2: UILabel
@IBOutlet var labelVariable3: UILabel

let apiInstance = GetInfoFromAPI()

@IBAction func buttonTapped(sender : AnyObject) {
labelVariable1 = apiInstance.getSpecificValue(1)
labelVariable2 = apiInstance.getSpecificValue(2)
labelVariable3 = apiInstance.getSpecificValue(3)
}

}

感谢您花时间回答我的问题。我是 swift 的新手,堆栈溢出非常有帮助!

最佳答案

让我试着解释一下 - 这是对线程的误解,我自己一开始就为之苦苦挣扎。我将尝试稍微简化一下。当您运行此代码时:

NSLog("Log 1")

NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
NSLog("Log in Completion Block")
})

NSLog("Log after request")

您将获得如下所示的输出:

Log 1
Log after request
Log in completion block

让我制作一个图表,一种时间线:

                    "Log 1" (before request is sent)
|
|
Request sent over Internet
|
/ \
"Log after request" |
This is logged *before* |
the other one, because this |
one doesn't have to wait for |
the network to respond. |
|
The method finishes and returns a value. |
------------------------------------------------------------------------------
| The network finally responds,
| and the completion block is run.
|

"Log in completion block"

垂直线是方法结束和返回的地方。在所有情况下,在运行完成 block 之前,您的方法都已经向其调用者返回了一个值。你不能线性地考虑这个。

Am I supposed to do all of the work with this request in this block and not get the data out?

是的,本质上。如果您向我展示首先调用 getAsynchData() 的代码,我可以提供更多帮助。

关于swift - 在 NSURLConnection 的 Swift 中从 completionHandler 获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24792872/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com