NSURLConnection失败 - 1003

时间:2011-07-04 15:19:27

标签: objective-c timeout nsurlconnection nsurlrequest

我尝试使用命令:

从某些网址检索数据
-(NSMutableData *) callUrl: (NSString *)url withData:(NSMutableDictionary *)data delegate:(id) delegate {

    NSURL *executeUrl = [NSURL URLWithString:<string>];
    NSURLRequest *request = [NSURLRequest requestWithURL: executeUrl
                             cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                             timeoutInterval:60];

    NSMutableData *receivedData = nil;

    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:request delegate:delegate];
    if (theConnection) {
        receivedData = [[NSMutableData data] retain];
    } else {
        @throw @"Connection error";
    }

    return receivedData;
}

在委托中(在connectionDidFinish和connectionDidFailWithError之后)我这样做:

//some uninvasive alerts
// release the connection, and the data object
[connection release];
[receivedData release];

问题是,当我提供错误的网址时,我得到了正确的错误 - 这是很好的部分 - 但后来我想要执行第二个网址 - 确实很好,我有1003错误 - NSURLErrorCannotFindHost。

大约1-2分钟后,我成功调用了url并获取数据。 我怀疑一些超时和端口业务,但在NSURLRequest中更改超时不会改变一件事。

更新

事实证明 - 管理员在通过WiFi网络到达DNS服务器时遇到了一些问题。代码很好。谢谢你的回复。 如果有些问题类似:尝试使用ip地址而不是主机名。

3 个答案:

答案 0 :(得分:1)

从Apple iOS开发人员文档中,1003错误指的是无法解析URL的主机名。为了避免在DNS中出现DNS故障,重载DNS场景,最好从主机名解析ip以供后续使用,或者直接硬编码IP地址,如果你不打算稍后转移主机。

Apple文档:

URL Loading System Error Codes

这些值作为NSError对象的错误代码属性返回,其域名为“NSURLErrorDomain”。

enum
 { 
  NSURLErrorBadURL = -1000,
  NSURLErrorTimedOut = -1001,
  NSURLErrorUnsupportedURL = -1002,
  NSURLErrorCannotFindHost = -1003,//****
  NSURLErrorCannotConnectToHost = -1004,
  NSURLErrorDataLengthExceedsMaximum = -1103,
  NSURLErrorNetworkConnectionLost = -1005,
  NSURLErrorDNSLookupFailed = -1006,
  ...
  }

1003 NSURLErrorCannotFindHost
Returned when the host name for a URL cannot be resolved.
Available in iOS 2.0 and later.
Declared in NSURLError.h.

答案 1 :(得分:1)

我做了两件事来解决这个问题:

  1. 我在启动NSUrlConnection之前使用过它

    [NSURLConnection cancelPreviousPerformRequestsWithTarget:self];

  2. 我在DNS设置中将DNS更改为8.8.8.8,这是google的公共DNS服务器。
  3. 不知道哪一个修好了但是问题已经解决了。

答案 2 :(得分:0)

在进行任何新的连接呼叫之前取消之前的连接。 使用

[self.connection cancel];