1

我正在尝试使用 Swift 构建一个非常基本的 iOS 应用程序——这是我第一次这样做。尽管其中大部分内容都非常简单。让应用程序与我的 API 或任何一般网站对话,我做了一场噩梦!

这是我正在使用的代码,特别是出错的代码:

     NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{     (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
         println(NSString(data: data, encoding: NSUTF8StringEncoding))
     })

错误的是 'NSString(data: data, encoding: NSUTF8StringEncoding)'

我已经阅读了尽可能多的教程,它们都给我同样的问题。我收到一条错误消息:

NSURLErrorDomain - 代码:4294966291

我还收到一个“EXC_BAD_INSTRUCTION”错误:EXC_1386_INVOP,子代码 = 0x0(这并没有让我找到解决方案......

这让我觉得我在我的设置中没有做正确的事情,或者我的偏好中应该打开一些东西,或者与我的代码相反的东西......

这是我的全部代码:

    var URL: NSURL = NSURL(string: "http://stackoverflow.com")

    var request:NSMutableURLRequest = NSMutableURLRequest(URL:URL)
    request.HTTPMethod = "POST"

    var bodyData = "key1=value&key2=value&key3=value"

    println(URL)
    println(bodyData)

    request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding);
    let queue:NSOperationQueue = NSOperationQueue()

    NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
        println(NSString(data: data, encoding: NSUTF8StringEncoding))
    })

更新:

使用 Rob 的代码,我知道会打印一个错误:

sendAsynchronousRequest 错误:错误域=NSURLErrorDomain 代码=-1005“网络连接丢失。” UserInfo=0x7beafcc0 {NSErrorFailingURLStringKey= http://stackoverflow.com , _kCFStreamErrorCodeKey=57, NSErrorFailingURLKey= http://stackoverflow.com , NSLocalizedDescription=网络连接丢失。, _kCFStreamErrorDomainKey=1, NSUnderlyingError=0x7d154ca0 "网络连接丢失."}

4

2 回答 2

2

听起来像是datanil检查error对象的内容,它应该会告诉您原因。很可能, 有问题request,但除非我们能重现问题,否则很难诊断。

无论如何,如果你想用更多的诊断信息来执行请求(error如果有问题,记录statusCoderesponse如果状态码不是 200 等):

NSURLConnection.sendAsynchronousRequest(request, queue: queue) {
    response, data, error in

    if data == nil {
        println("sendAsynchronousRequest error: \(error)")
        return
    }

    if let httpResponse = response as? NSHTTPURLResponse {
        let statusCode = httpResponse.statusCode
        if statusCode != 200 {
            println("sendAsynchronousRequest status code = \(statusCode); response = \(response)")
        }
    }

    println(NSString(data: data, encoding: NSUTF8StringEncoding))
}

在您修改后的问题中,您共享了NSError报告的结果-1005(回想起来,这与您之前向我们展示的错误代码相同4294966291;后者是 的无符号整数表示-1005)。此错误(如描述所述)是针对NSURLErrorNetworkConnectionLost(即kCFURLErrorNetworkConnectionLost)的,文档说“在进行中的负载中间断开客户端或服务器连接时返回”。

不幸的是,此错误用于各种问题,并且由于我无法重现您描述的错误,因此很难诊断。


请求中缺少的一件事是规范Content-Type

request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")

这不会导致您描述的问题,但最好始终通知服务器请求的类型。

于 2014-10-08T14:03:48.653 回答
1

我解决了这个问题,部分归功于 Rob 的回答和一般帮助 - 这非常有用。

不过,最后的关键非常简单,取自这个问题:Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost."

我只需要重新启动模拟器。但是,如果没有额外的 if data == nil {} 语句,我就不会到达那里。

于 2014-10-08T15:21:23.977 回答