iPhone开发下载网络数据的几种方法总结
2013-01-18 12:14 三戒1993 阅读(125) 评论(0) 收藏 举报-
01.NSString *urlAsString = @"http://www.jouhu.com/json/info.zip";---要下载的全路径名02.NSURL *url = [NSURL URLWithString:urlAsString];03.NSURLRequest *request = [NSURLRequest requestWithURL:url];04.NSError *error = nil;05.06.NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];07./*下载的数据*/08.if(data!=nil) {09.NSLog(@"下载成功");10.if([data writeToFile:@"/Users/sunningning/Desktop/activation.zip"atomically:YES]) {--下载到目的路径名11.NSLog(@"保存成功!");12.}13.else14.{15.NSLog(@"保存失败!");16.}17.}18.else{19.NSLog(@"%@",error);20.}
2 使用NSURLConnection的异步方法下载
01.NSString *urlAsString = @"http://www.apple.com";02.NSURL *url = [NSURL URLWithString:urlAsString];03.NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];04.NSOperationQueue *queue = [[NSOperationQueue alloc] init];05.06.[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response,NSData *data, NSError *error)07.{08.if([data length] >0&& error == nil){09.NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];10.NSLog(@"HTML = %@", html); }11.12.elseif([data length] ==0&& error == nil){13.NSLog(@"Nothing was downloaded.");14.}15.16.elseif(error != nil){17.NSLog(@"Error happened = %@", error); }18.}];
3 使用NSURLConnection的异步+GCD的方法下载
01.+ (void)performRequestWithUri:(NSString *)requestUri params:(NSDictionary *)params completionHandler:(void(^)(NSDictionary *, NSError *))completionBlock02.{03.04.// Generate the URL05.NSString *requestUrl = [NSString stringWithFormat:@"http://the.api.com%@", requestUri];06.07.// Create the connection08.NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:requestUrl]];09.10.// Make an NSOperationQueue11.NSOperationQueue *queue = [[NSOperationQueue alloc] init];12.[queue setName:@"com.your.unique.queue.name"];13.14.// Send an asyncronous request on the queue15.[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {16.17.// If there was an error getting the data18.if(error) {19.20.dispatch_async(dispatch_get_main_queue(), ^(void) {21.completionBlock(nil, error);22.});23.return;24.}25.26.// Decode the data27.NSError *jsonError;28.NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:data options:0error:&jsonError];29.30.// If there was an error decoding the JSON31.if(jsonError) {32.33.dispatch_async(dispatch_get_main_queue(), ^(void) {34.35.});36.return;37.}38.39.// All looks fine, lets call the completion block with the response data40.dispatch_async(dispatch_get_main_queue(), ^(void) {41.completionBlock(responseDict, nil);42.});43.}];44.}
具体调用方法:
1.[SHAPIController performRequestWithUri:@"http://www.jouhu.com/json/info.php"params:nil completionHandler:^(NSDictionary *response, NSError *error) {2.3.if(error) {4.NSLog(@"%@", error);5.}6.7.NSLog(@"%@", response);8.}];
返回的数据根据我们而定.
4 实现delegate的方法实现异步
01.NSURLConnection *conn= [[NSURLConnection alloc]02.initWithRequest:theRequest delegate:self];03.[conn start];04.if(conn)05.{06.NSLog(@"Connection Successful");07.}08.else09.{10.NSLog(@"Connection could not be made");11.}12.}
01.- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)theResponse {02.self.response = theResponse;03.[data setLength:0];// reset data04.}05.06.- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)theData {07.[data appendData:theData];// append incoming data08.}09.10.- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {11.[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;12.self.data = nil;13.if(handler) { [queue addOperationWithBlock:^{ handler(response, nil, error); }]; }14.}15.16.- (void)connectionDidFinishLoading:(NSURLConnection *)connection {17.[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;18.// TODO: Are we passing the arguments to the block correctly? Should we copy them?19.handleData(self.data);//处理数据,需要定义方法20.}
我们自身的应用采用的是最后一种方法,对于很多图片更新的,可以采取第三种方法,第一种方法是同步数据下载,容易造成UI阻塞。需要注意。
浙公网安备 33010602011771号