2013-02-16 29 views
9

我使用NSURLConnection的積木

[NSURLConnection connectionWithRequest:req delegate:self]; 

,然後我用

-(BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace; 
-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge; 
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error; 
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; 
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; 
-(void)connectionDidFinishLoading:(NSURLConnection *)connection; 

來處理數據加載。一切正常,工作正常,但我不喜歡這個代碼之美)

我希望用塊,使我的代碼看起來是這樣的:

[myConnection sendData:data 
      successBlock:^(void){NSLog(@"success");} 
      errorBlock:^(NSError * error){NSLog(@"error.description: %@", error.description);}]; 

是有可能使用NSURLConnection的使用塊?

回答

15

我使用這個類:

MyConnection.h

#import <Foundation/Foundation.h> 

@interface MyConnection : NSObject <NSURLConnectionDelegate, NSURLConnectionDataDelegate> { 
    NSURLConnection * internalConnection; 
    NSMutableData * container; 
} 

-(id)initWithRequest:(NSURLRequest *)req; 

@property (nonatomic,copy)NSURLConnection * internalConnection; 
@property (nonatomic,copy)NSURLRequest *request; 
@property (nonatomic,copy)void (^completitionBlock) (id obj, NSError * err); 


-(void)start; 

@end 

而且MyConnection.m

#import "MyConnection.h" 

static NSMutableArray *sharedConnectionList = nil; 

@implementation MyConnection 
@synthesize request,completitionBlock,internalConnection; 

-(id)initWithRequest:(NSURLRequest *)req { 
    self = [super init]; 
    if (self) { 
     [self setRequest:req]; 
    } 
    return self; 
} 

-(void)start { 

    container = [[NSMutableData alloc]init]; 

    internalConnection = [[NSURLConnection alloc]initWithRequest:[self request] delegate:self startImmediately:YES]; 

    if(!sharedConnectionList) 
     sharedConnectionList = [[NSMutableArray alloc] init]; 
    [sharedConnectionList addObject:self]; 

} 


#pragma mark NSURLConnectionDelegate methods 

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 

    [container appendData:data]; 

} 

//If finish, return the data and the error nil 
-(void)connectionDidFinishLoading:(NSURLConnection *)connection { 

    if([self completitionBlock]) 
     [self completitionBlock](container,nil); 

    [sharedConnectionList removeObject:self]; 

} 

//If fail, return nil and an error 
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 

    if([self completitionBlock]) 
     [self completitionBlock](nil,error); 

    [sharedConnectionList removeObject:self]; 

} 

@end 

使用它:

MyConnection * connection = [[MyConnection alloc]initWithRequest:req]; 
[connection setCompletitionBlock:^(id obj, NSError *err) { 

      if (!err) { 
       //It's ok, do domething with the response data (obj)     
      } else { 
       //There was an error 
      } 

     }]; 
[connection start]; 

這是巴sed的代碼,大書呆子牧場用於他的書。

+0

謝謝jcesar,它的工作)非常感謝! – Nils 2013-02-17 07:37:17

+0

這看起來很奇怪。如果您在對象上調用另一個請求,則可能會覆蓋完成塊... – Tudorizer 2013-04-17 16:15:36

+0

感謝您的幫助。 Tudorizer,你需要爲新的請求創建新的實例。 – Segabond 2013-09-03 10:10:53

-1

我希望這會有所幫助。

[NSURLConnection sendAsynchronousRequest:request 
            queue:[NSOperationQueue mainQueue] 
         completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { 
          NSLog(@"%@", response); 
          NSLog(@"%@", data); 
         }]; 
+0

爲什麼你使用主隊列? – 2016-12-21 14:56:57