如何使用NSUrlConnection从Web获取数据?

Nar*_*kat 0 objective-c nsurlconnection

在我的应用程序中,我想使用NSURLConnection该类.那么请告诉我如何使用这个?这包含了很多委托方法,请告诉我如何使用它们?

sEl*_*yan 12

使用启动连接

self.responseData = [NSMutableData data];
NSURL *url = [NSURL URLWithString:@"http://sampleurl/"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection autorelease];
Run Code Online (Sandbox Code Playgroud)

并且您可以在connectionDidFinishLoading委托方法中捕获响应

#pragma mark - NSURLConnection Delegate Methods

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    [self.responseData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [self.responseData appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"Connection failed: %@", [error description]);
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
        //Getting your response string
    NSString *responseString = [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding];
self.responseData = nil;
    }
Run Code Online (Sandbox Code Playgroud)

为你的内存泄漏问题

在接口文件中声明响应数据

NSMutableData *_responseData;
Run Code Online (Sandbox Code Playgroud)

财产如下

@property (nonatomic, retain) NSMutableData *responseData;
Run Code Online (Sandbox Code Playgroud)

并合成它

@synthesize responseData = _responseData;
Run Code Online (Sandbox Code Playgroud)

不要在任何地方发布它(我们使用方便的构造函数进行分配).我们已经在connectionDidFinishLoading方法中将其设置为nil.


San*_*eev 5

在iOS 5和OS X 10.7或更高版本中,您可以使用以下方法异步加载数据:

NSURL *url = [NSURL URLWithString:@"http://sampleurl/"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue currentQueue]
       completionHandler: ^(NSURLResponse * response, NSData * data, NSError * error) {
           NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse*)response;
           if(httpResponse.statusCode == 200) {
               //your code to handle the data
           }
       }
];
Run Code Online (Sandbox Code Playgroud)

或者,如果您想同步执行操作(如果正在加载大数据,因为它会挂起应用程序,则不建议这样做)(在OS X 10.2+和iOS 2.0+中可用)

NSURL *url = [NSURL URLWithString:@"http://sampleurl/"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
NSURLResponse * response;
NSError * error;
NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
Run Code Online (Sandbox Code Playgroud)