|
异步:
NSMutableData* buf = [[NSMutableData alloc] initWithLength:0];
NSURLConnection* connection = [[NSURLConnection alloc] initWithRequest:req delegate:self];
//
收到响应时, 会触发
- (void)connection:(NSURLConnection *)aConnection didReceiveResponse:(NSURLResponse *)aResponse;
//
你可以在里面判断返回结果, 或者处理返回的http头中的信息
//
每收到一次数据, 会调用一次
- (void)connection:(NSURLConnection *)aConn didReceiveData:(NSData *)data;
//
因此一般来说,是
- (void)connection:(NSURLConnection *)aConn didReceiveData:(NSData *)data
{
[buf appendData:data];
}
//
当然buffer就是前面initWithRequest时同时声明的.
//
网络错误时触发
- (void)connection:(NSURLConnection *)aConn didFailWithError:(NSError *)error;
//
全部数据接收完毕时触发
- (void)connectionDidFinishLoading:(NSURLConnection *)aConn;
|
// 初始化请求
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
// 设置URL
[request setURL:[NSURL URLWithString:urlStr]];
// 设置HTTP方法
[request setHTTPMethod:@"GET"];
// 发 送同步请求, 这里得returnData就是返回得数据了
NSData *returnData = [NSURLConnection sendSynchronousRequest:request
returningResponse:nil error:nil];
// 释放对象
[request release];
异步请求代码
//
.h file:
//
// DownloadHelper.h
// BigViewApp
//
// Created by lu Yinghuai on 11-2-14.
// Copyright 2011 minesage. All rights reserved.
//
#import < Foundation / Foundation.h >
@protocol DownloadHelperDelegate;
@interface DownloadHelper : NSObject {
@private
NSURLConnection * appListFeedConnection;
NSMutableData * appListData;
NSString * strResultData;
id < DownloadHelperDelegate > delegate ;
}
- (id)initWithDelegate: (id < DownloadHelperDelegate > )theDelegate;
- ( void ) startDownload: (NSString * ) targetUrl;
@property (nonatomic, assign) id < DownloadHelperDelegate > delegate ;
@property (nonatomic, retain) NSURLConnection * appListFeedConnection;
@property (nonatomic, retain) NSMutableData * appListData;
@property (nonatomic, retain) NSString * strResultData;
@end
@protocol DownloadHelperDelegate
- ( void )didFinishDownload:(NSString * ) strResult;
- ( void )downloadErrorOccurred:(NSError * ) error;
@end
// .m file
//
// DownloadHelper.m
// BigViewApp
//
// Created by lu Yinghuai on 11-2-14.
// Copyright 2011 minesage. All rights reserved.
//
#import " DownloadHelper.h "
@implementation DownloadHelper
@synthesize appListFeedConnection, appListData, delegate ,strResultData;
- (id)initWithDelegate:(id < DownloadHelperDelegate > )theDelegate
{
self = [super init];
if (self != nil)
{
self. delegate = theDelegate;
// strResultData = [[NSString alloc] init];
}
return self;
}
- ( void ) startDownload: (NSString * ) targetUrl {
NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:targetUrl]];
self.appListFeedConnection = [[[NSURLConnection alloc] initWithRequest:urlRequest delegate :self] autorelease];
// Test the validity of the connection object. The most likely reason for the connection object
// to be nil is a malformed URL, which is a programmatic error easily detected during development
// If the URL is more dynamic, then you should implement a more flexible validation technique, and
// be able to both recover from errors and communicate problems to the user in an unobtrusive manner.
//
NSAssert(self.appListFeedConnection != nil, @" Failure to create URL connection. " );
// show in the status bar that network activity is starting
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}
#pragma mark -
#pragma mark NSURLConnection delegate methods
// -------------------------------------------------------------------------------
// handleError:error
// -------------------------------------------------------------------------------
- ( void )handleError:(NSError * )error
{
/* NSString *errorMessage = [error localizedDescription];
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Cannot Show Top Paid Apps"
message:errorMessage
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alertView show];
[alertView release]; */
[ delegate downloadErrorOccurred:error];
}
// The following are delegate methods for NSURLConnection. Similar to callback functions, this is how
// the connection object, which is working in the background, can asynchronously communicate back to
// its delegate on the thread from which it was started - in this case, the main thread.
//
// -------------------------------------------------------------------------------
// connection:didReceiveResponse:response
// -------------------------------------------------------------------------------
- ( void )connection:(NSURLConnection * )connection didReceiveResponse:(NSURLResponse * )response
{
self.appListData = [NSMutableData data]; // start off with new data
}
// -------------------------------------------------------------------------------
// connection:didReceiveData:data
// -------------------------------------------------------------------------------
- ( void )connection:(NSURLConnection * )connection didReceiveData:(NSData * )data
{
[appListData appendData:data]; // append incoming data
}
// -------------------------------------------------------------------------------
// connection:didFailWithError:error
// -------------------------------------------------------------------------------
- ( void )connection:(NSURLConnection * )connection didFailWithError:(NSError * )error
{
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
if ([error code] == kCFURLErrorNotConnectedToInternet)
{
// if we can identify the error, we can present a more precise message to the user.
NSDictionary * userInfo = [NSDictionary dictionaryWithObject: @" No Connection Error "
forKey:NSLocalizedDescriptionKey];
NSError * noConnectionError = [NSError errorWithDomain:NSCocoaErrorDomain
code:kCFURLErrorNotConnectedToInternet
userInfo:userInfo];
[self handleError:noConnectionError];
}
else
{
// otherwise handle the error generically
[self handleError:error];
}
self.appListFeedConnection = nil; // release our connection
}
// -------------------------------------------------------------------------------
// connectionDidFinishLoading:connection
// -------------------------------------------------------------------------------
- ( void )connectionDidFinishLoading:(NSURLConnection * )connection
{
self.appListFeedConnection = nil; // release our connection
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
strResultData = [[NSString alloc] initWithData:appListData encoding:NSASCIIStringEncoding];
NSLog( @" %@ " ,strResultData);
[ delegate didFinishDownload:strResultData];
self.appListData = nil;
}
// -------------------------------------------------------------------------------
// dealloc
// -------------------------------------------------------------------------------
- ( void )dealloc
{
[appListFeedConnection release];
[appListData release];
[strResultData release];
[super dealloc];
}
@end
// .m 调用代码
1 .实例化:
// download 排行榜
downLoadHelper = [[DownloadHelper alloc] initWithDelegate:self];
2 . // 下载排行榜数据
[downLoadHelper startDownload: @" http://www.google.com/trends/hottrends/atom/hourly " ];
3 .委托对象回调方法
#pragma mark ------ DownloadHelper Delegate Method ------
- ( void ) didFinishDownload:(NSString * ) strResult{
NSLog( @" didFinishDownload " );
[hotTrend.keyWordRecordList removeAllObjects];
NSLog( @" %@ " ,strResult);
}
- ( void ) downloadErrorOccurred:(NSError * ) error{
NSLog( @" downloadErrorOccurred " );
}
//
// DownloadHelper.h
// BigViewApp
//
// Created by lu Yinghuai on 11-2-14.
// Copyright 2011 minesage. All rights reserved.
//
#import < Foundation / Foundation.h >
@protocol DownloadHelperDelegate;
@interface DownloadHelper : NSObject {
@private
NSURLConnection * appListFeedConnection;
NSMutableData * appListData;
NSString * strResultData;
id < DownloadHelperDelegate > delegate ;
}
- (id)initWithDelegate: (id < DownloadHelperDelegate > )theDelegate;
- ( void ) startDownload: (NSString * ) targetUrl;
@property (nonatomic, assign) id < DownloadHelperDelegate > delegate ;
@property (nonatomic, retain) NSURLConnection * appListFeedConnection;
@property (nonatomic, retain) NSMutableData * appListData;
@property (nonatomic, retain) NSString * strResultData;
@end
@protocol DownloadHelperDelegate
- ( void )didFinishDownload:(NSString * ) strResult;
- ( void )downloadErrorOccurred:(NSError * ) error;
@end
// .m file
//
// DownloadHelper.m
// BigViewApp
//
// Created by lu Yinghuai on 11-2-14.
// Copyright 2011 minesage. All rights reserved.
//
#import " DownloadHelper.h "
@implementation DownloadHelper
@synthesize appListFeedConnection, appListData, delegate ,strResultData;
- (id)initWithDelegate:(id < DownloadHelperDelegate > )theDelegate
{
self = [super init];
if (self != nil)
{
self. delegate = theDelegate;
// strResultData = [[NSString alloc] init];
}
return self;
}
- ( void ) startDownload: (NSString * ) targetUrl {
NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:targetUrl]];
self.appListFeedConnection = [[[NSURLConnection alloc] initWithRequest:urlRequest delegate :self] autorelease];
// Test the validity of the connection object. The most likely reason for the connection object
// to be nil is a malformed URL, which is a programmatic error easily detected during development
// If the URL is more dynamic, then you should implement a more flexible validation technique, and
// be able to both recover from errors and communicate problems to the user in an unobtrusive manner.
//
NSAssert(self.appListFeedConnection != nil, @" Failure to create URL connection. " );
// show in the status bar that network activity is starting
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}
#pragma mark -
#pragma mark NSURLConnection delegate methods
// -------------------------------------------------------------------------------
// handleError:error
// -------------------------------------------------------------------------------
- ( void )handleError:(NSError * )error
{
/* NSString *errorMessage = [error localizedDescription];
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Cannot Show Top Paid Apps"
message:errorMessage
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alertView show];
[alertView release]; */
[ delegate downloadErrorOccurred:error];
}
// The following are delegate methods for NSURLConnection. Similar to callback functions, this is how
// the connection object, which is working in the background, can asynchronously communicate back to
// its delegate on the thread from which it was started - in this case, the main thread.
//
// -------------------------------------------------------------------------------
// connection:didReceiveResponse:response
// -------------------------------------------------------------------------------
- ( void )connection:(NSURLConnection * )connection didReceiveResponse:(NSURLResponse * )response
{
self.appListData = [NSMutableData data]; // start off with new data
}
// -------------------------------------------------------------------------------
// connection:didReceiveData:data
// -------------------------------------------------------------------------------
- ( void )connection:(NSURLConnection * )connection didReceiveData:(NSData * )data
{
[appListData appendData:data]; // append incoming data
}
// -------------------------------------------------------------------------------
// connection:didFailWithError:error
// -------------------------------------------------------------------------------
- ( void )connection:(NSURLConnection * )connection didFailWithError:(NSError * )error
{
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
if ([error code] == kCFURLErrorNotConnectedToInternet)
{
// if we can identify the error, we can present a more precise message to the user.
NSDictionary * userInfo = [NSDictionary dictionaryWithObject: @" No Connection Error "
forKey:NSLocalizedDescriptionKey];
NSError * noConnectionError = [NSError errorWithDomain:NSCocoaErrorDomain
code:kCFURLErrorNotConnectedToInternet
userInfo:userInfo];
[self handleError:noConnectionError];
}
else
{
// otherwise handle the error generically
[self handleError:error];
}
self.appListFeedConnection = nil; // release our connection
}
// -------------------------------------------------------------------------------
// connectionDidFinishLoading:connection
// -------------------------------------------------------------------------------
- ( void )connectionDidFinishLoading:(NSURLConnection * )connection
{
self.appListFeedConnection = nil; // release our connection
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
strResultData = [[NSString alloc] initWithData:appListData encoding:NSASCIIStringEncoding];
NSLog( @" %@ " ,strResultData);
[ delegate didFinishDownload:strResultData];
self.appListData = nil;
}
// -------------------------------------------------------------------------------
// dealloc
// -------------------------------------------------------------------------------
- ( void )dealloc
{
[appListFeedConnection release];
[appListData release];
[strResultData release];
[super dealloc];
}
@end
// .m 调用代码
1 .实例化:
// download 排行榜
downLoadHelper = [[DownloadHelper alloc] initWithDelegate:self];
2 . // 下载排行榜数据
[downLoadHelper startDownload: @" http://www.google.com/trends/hottrends/atom/hourly " ];
3 .委托对象回调方法
#pragma mark ------ DownloadHelper Delegate Method ------
- ( void ) didFinishDownload:(NSString * ) strResult{
NSLog( @" didFinishDownload " );
[hotTrend.keyWordRecordList removeAllObjects];
NSLog( @" %@ " ,strResult);
}
- ( void ) downloadErrorOccurred:(NSError * ) error{
NSLog( @" downloadErrorOccurred " );
}
第二段是同步请求
本文介绍iPhone开发中使用NSURLConnection实现异步与同步HTTP请求的方法。异步请求通过代理方法接收数据并处理错误,适用于后台加载数据;同步请求直接返回数据,适合小规模数据获取。

1351

被折叠的 条评论
为什么被折叠?



