iPhone开发下载网络数据的几种方法总结
2013-01-18 12:14 三戒1993 阅读(111) 评论(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.
else
14.
{
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.
else
if
([data length] ==
0
&& error == nil){
13.
NSLog(@
"Nothing was downloaded."
);
14.
}
15.
16.
else
if
(error != nil){
17.
NSLog(@
"Error happened = %@"
, error); }
18.
}];
3 使用NSURLConnection的异步+GCD的方法下载
01.
+ (
void
)performRequestWithUri:(NSString *)requestUri params:(NSDictionary *)params completionHandler:(
void
(^)(NSDictionary *, NSError *))completionBlock
02.
{
03.
04.
// Generate the URL
05.
NSString *requestUrl = [NSString stringWithFormat:@
"http://the.api.com%@"
, requestUri];
06.
07.
// Create the connection
08.
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:requestUrl]];
09.
10.
// Make an NSOperationQueue
11.
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
12.
[queue setName:@
"com.your.unique.queue.name"
];
13.
14.
// Send an asyncronous request on the queue
15.
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
16.
17.
// If there was an error getting the data
18.
if
(error) {
19.
20.
dispatch_async(dispatch_get_main_queue(), ^(
void
) {
21.
completionBlock(nil, error);
22.
});
23.
return
;
24.
}
25.
26.
// Decode the data
27.
NSError *jsonError;
28.
NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:data options:
0
error:&jsonError];
29.
30.
// If there was an error decoding the JSON
31.
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 data
40.
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.
else
09.
{
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 data
04.
}
05.
06.
- (
void
)connection:(NSURLConnection *)connection didReceiveData:(NSData *)theData {
07.
[data appendData:theData];
// append incoming data
08.
}
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阻塞。需要注意。