asihttp 源码分析一

一:发起一个同步请求

 

C代码   收藏代码
  1. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];   
  2. [request startSynchronous];  

 首先看一下ASIHTTPRequest 类

 

 @interface ASIHTTPRequest : NSOperation <NSCopying>

该类是NSOperation 的子类,所以该类的实例可以添加进 NSOperationQueue 队列中进行异步的请求。

 

发起synshronous请求的方法

 

Cpp代码   收藏代码
  1. - (void)startSynchronous  
  2. {  
  3. #if DEBUG_REQUEST_STATUS || DEBUG_THROTTLING  
  4.     NSLog(@"Starting synchronous request %@",self);  
  5. #endif  
  6.     [self setSynchronous:YES];  
  7.     [self setRunLoopMode:ASIHTTPRequestRunLoopMode];  
  8.     [self setInProgress:YES];  
  9.   
  10.     if (![self isCancelled] && ![self complete]) {  
  11.         [self main];  
  12.         while (!complete) {  
  13.             [[NSRunLoop currentRunLoop] runMode:[self runLoopMode] beforeDate:[NSDate distantFuture]];  
  14.         }  
  15.     }  
  16.   
  17.     [self setInProgress:NO];  
  18. }  

 

直接调用了[self main] 。

并且把runloopmode 设置为 ASIHTTPRequestRunLoopMode。

 

二:发起一个异步请求

 

   ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

    [request startAsynchronous];

 

startAsynchronous方法的实际内容为:

 

Cpp代码   收藏代码
  1. - (void)startAsynchronous  
  2.   
  3.     [sharedQueue addOperation:self];  

 
request被加入到sharedQueue 队列中,在这里并没有看到该变量的初始化,那么它是在哪里被初始化的呢??

Cpp代码   收藏代码
  1. //在程序运行过程中,它会在你程序中每个类调用一次initialize。这个调用的时间发生在你的类接收到消息之前,但是在它的超类接收到initialize之后。  
  2.   
  3. + (void)initialize  
  4. {  
  5.     if (self == [ASIHTTPRequest class]) {  
  6.         persistentConnectionsPool = [[NSMutableArray alloc] init];  
  7.         connectionsLock = [[NSRecursiveLock alloc] init];  
  8.         progressLock = [[NSRecursiveLock alloc] init];  
  9.         bandwidthThrottlingLock = [[NSLock alloc] init];  
  10.         sessionCookiesLock = [[NSRecursiveLock alloc] init];  
  11.         sessionCredentialsLock = [[NSRecursiveLock alloc] init];  
  12.         delegateAuthenticationLock = [[NSRecursiveLock alloc] init];  
  13.         bandwidthUsageTracker = [[NSMutableArray alloc] initWithCapacity:5];  
  14.         ASIRequestTimedOutError = [[NSError alloc] initWithDomain:NetworkRequestErrorDomain code:ASIRequestTimedOutErrorType userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@"The request timed out",NSLocalizedDescriptionKey,nil]];    
  15.         ASIAuthenticationError = [[NSError alloc] initWithDomain:NetworkRequestErrorDomain code:ASIAuthenticationErrorType userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@"Authentication needed",NSLocalizedDescriptionKey,nil]];  
  16.         ASIRequestCancelledError = [[NSError alloc] initWithDomain:NetworkRequestErrorDomain code:ASIRequestCancelledErrorType userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@"The request was cancelled",NSLocalizedDescriptionKey,nil]];  
  17.         ASIUnableToCreateRequestError = [[NSError alloc] initWithDomain:NetworkRequestErrorDomain code:ASIUnableToCreateRequestErrorType userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@"Unable to create request (bad url?)",NSLocalizedDescriptionKey,nil]];  
  18.         ASITooMuchRedirectionError = [[NSError alloc] initWithDomain:NetworkRequestErrorDomain code:ASITooMuchRedirectionErrorType userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@"The request failed because it redirected too many times",NSLocalizedDescriptionKey,nil]];  
  19.         sharedQueue = [[NSOperationQueue alloc] init];  
  20.         [sharedQueue setMaxConcurrentOperationCount:4];  
  21.   
  22.     }  
  23. }  

 

就是这个方法了。

并且sharedQueue的类型为NSOperationQueue 。并不是ASINetworkQueue,关于ASINetworkQueue类后面介绍

 

sharedQueue = [[NSOperationQueue alloc] init];
[sharedQueue setMaxConcurrentOperationCount:4];

 

 

三:关于http的一些信息

 

 

+ (id)requestWithURL:(NSURL *)newURL;

+ (id)requestWithURL:(NSURL *)newURL usingCache:(id <ASICacheDelegate>)cache;
+ (id)requestWithURL:(NSURL *)newURL usingCache:(id <ASICacheDelegate>)cache andCachePolicy:(ASICachePolicy)policy;

 

以上三种ASIHTTPRequest 的构建都是通过调用- (id)initWithURL:(NSURL *)newURL 方法。

 

 

Cpp代码   收藏代码
  1. - (id)initWithURL:(NSURL *)newURL  
  2. {  
  3.     self = [self init];  
  4.     [self setRequestMethod:@"GET"];  
  5.     [self setRunLoopMode:NSDefaultRunLoopMode];  
  6.     [self setShouldAttemptPersistentConnection:YES];  
  7.     [self setPersistentConnectionTimeoutSeconds:60.0];  
  8.     [self setShouldPresentCredentialsBeforeChallenge:YES];  
  9.     [self setShouldRedirect:YES];  
  10.     [self setShowAccurateProgress:YES];  
  11.     [self setShouldResetDownloadProgress:YES];  
  12.     [self setShouldResetUploadProgress:YES];  
  13.     [self setAllowCompressedResponse:YES];  
  14.     [self setShouldWaitToInflateCompressedResponses:YES];  
  15.     [self setDefaultResponseEncoding:NSISOLatin1StringEncoding];  
  16.     [self setShouldPresentProxyAuthenticationDialog:YES];  
  17.       
  18.     [self setTimeOutSeconds:[ASIHTTPRequest defaultTimeOutSeconds]];  
  19.     [self setUseSessionPersistence:YES];  
  20.     [self setUseCookiePersistence:YES];  
  21.     [self setValidatesSecureCertificate:YES];  
  22.     [self setRequestCookies:[[[NSMutableArray alloc] init] autorelease]];  
  23.     [self setDidStartSelector:@selector(requestStarted:)];  
  24.     [self setDidReceiveResponseHeadersSelector:@selector(request:didReceiveResponseHeaders:)];  
  25.     [self setWillRedirectSelector:@selector(request:willRedirectToURL:)];  
  26.     [self setDidFinishSelector:@selector(requestFinished:)];  
  27.     [self setDidFailSelector:@selector(requestFailed:)];  
  28.     [self setDidReceiveDataSelector:@selector(request:didReceiveData:)];  
  29.     [self setURL:newURL];  
  30.     [self setCancelledLock:[[[NSRecursiveLock alloc] init] autorelease]];  
  31.     [self setDownloadCache:[[self class] defaultCache]];  
  32.     return self;  
  33. }  

 

该方法设置一个http请求相关的属性,已经一些lock 的初始化。

 

四:下面看看实际联网的方法 main()

 

// Create the request
- (void)main{

 

}

改方法包含实际的请求逻辑,是整个的核心。

由于该方法过于庞大,在这里就不列出了,可以到ASIHTTPRequest.m文件中自行查找

你可能感兴趣的:(c,cache,url,interface)