不调用委托函数 - NSURLConnection
Delegate functions are not called - NSURLConnection
我是 swift 编码新手,所以我的大部分代码都是 "this is how I found it on the internet" 状态。
我正在尝试发送 HTTP GET 请求,然后使用它。我为此使用 NSURLConnection
。我的 Xcode 项目中有 2 个 swift 文件(这是一个 swift 控制台项目,而不是游乐场),一个是主要文件,第二个包含我的 class 我想用于委派:
import Foundation
class Remote: NSObject, NSURLConnectionDelegate {
var data = NSMutableData()
func connect() {
var url = NSURL(string: "https://www.google.com")
var request = NSURLRequest(URL: url!)
NSLog("Is%@ main thread", NSThread.isMainThread() ? "" : " NOT");
var conn = NSURLConnection(request: request, delegate: self, startImmediately: false)
conn?.scheduleInRunLoop(NSRunLoop.mainRunLoop(), forMode: NSDefaultRunLoopMode)
conn?.start()
sleep(2)
}
func connection(didReceiveResponse: NSURLConnection!, didReceiveResponse response: NSURLResponse!) {
println("didReceiveResponse")
}
func connection(connection: NSURLConnection!, didReceiveData conData: NSData!) {
println("didReceiveData")
}
func connectionDidFinishLoading(connection: NSURLConnection!) {
println("DidFinishLoading")
}
deinit {
println("deiniting")
}
}
这是我的主要 swift 代码:
import Foundation
var xxx = Remote()
xxx.connect()
sleep(10)
sleep(2)
当我在委托函数中的每个 println
上设置断点时,它们永远不会被命中。根据 NSLog
输出从主线程完成执行。
在调试器中,我可以看到通过网络发送和接收数据,但我从未得到任何输出。我在这里看到了很多类似的问题,但没有任何帮助。
我做错了什么?
正如 Martin R 建议的那样,我在启动后立即将正确的 NSRunLoop 添加到我的代码中 NSURLConnection:
self.shouldKeepRunning = true
let theRL = NSRunLoop.currentRunLoop()
while self.shouldKeepRunning && theRL.runMode(NSDefaultRunLoopMode, beforeDate: NSDate(timeInterval: 1.0, sinceDate: NSDate())) { }
shouldKeepRunning 是在我的 class 中定义的 bool 变量,它在委托函数 connectionDidFinishLoading 中设置为 false,所以
我是 swift 编码新手,所以我的大部分代码都是 "this is how I found it on the internet" 状态。
我正在尝试发送 HTTP GET 请求,然后使用它。我为此使用 NSURLConnection
。我的 Xcode 项目中有 2 个 swift 文件(这是一个 swift 控制台项目,而不是游乐场),一个是主要文件,第二个包含我的 class 我想用于委派:
import Foundation
class Remote: NSObject, NSURLConnectionDelegate {
var data = NSMutableData()
func connect() {
var url = NSURL(string: "https://www.google.com")
var request = NSURLRequest(URL: url!)
NSLog("Is%@ main thread", NSThread.isMainThread() ? "" : " NOT");
var conn = NSURLConnection(request: request, delegate: self, startImmediately: false)
conn?.scheduleInRunLoop(NSRunLoop.mainRunLoop(), forMode: NSDefaultRunLoopMode)
conn?.start()
sleep(2)
}
func connection(didReceiveResponse: NSURLConnection!, didReceiveResponse response: NSURLResponse!) {
println("didReceiveResponse")
}
func connection(connection: NSURLConnection!, didReceiveData conData: NSData!) {
println("didReceiveData")
}
func connectionDidFinishLoading(connection: NSURLConnection!) {
println("DidFinishLoading")
}
deinit {
println("deiniting")
}
}
这是我的主要 swift 代码:
import Foundation
var xxx = Remote()
xxx.connect()
sleep(10)
sleep(2)
当我在委托函数中的每个 println
上设置断点时,它们永远不会被命中。根据 NSLog
输出从主线程完成执行。
在调试器中,我可以看到通过网络发送和接收数据,但我从未得到任何输出。我在这里看到了很多类似的问题,但没有任何帮助。
我做错了什么?
正如 Martin R 建议的那样,我在启动后立即将正确的 NSRunLoop 添加到我的代码中 NSURLConnection:
self.shouldKeepRunning = true
let theRL = NSRunLoop.currentRunLoop()
while self.shouldKeepRunning && theRL.runMode(NSDefaultRunLoopMode, beforeDate: NSDate(timeInterval: 1.0, sinceDate: NSDate())) { }
shouldKeepRunning 是在我的 class 中定义的 bool 变量,它在委托函数 connectionDidFinishLoading 中设置为 false,所以