2013-02-16 13 views
9

sto usandoNSURLConnection con blocchi

[NSURLConnection connectionWithRequest:req delegate:self]; 

e poi usare

-(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; 

per gestire il caricamento dei dati. Tutto è ok e lavorare bene, ma non mi piace la bellezza di questo codice)

desidero utilizzare blocchi, per fare il mio codice è simile al seguente:

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

è possibile utilizzare NSURLConnection con blocchi?

risposta

15

Io uso questa classe:

Il 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 

E il 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 

per usarlo:

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]; 

E 'ba sed nel codice, The Big Nerd Ranch usa nel suo libro.

+0

Grazie jcesar, ha funzionato) grazie mille !! – Nils

+0

Questo sembra strano. Se chiami un'altra richiesta sul tuo oggetto, il blocco di completamento può essere sovrascritto ... – Tudorizer

+0

Grazie per l'aiuto. Tudorizer, è necessario creare una nuova istanza per la nuova richiesta. – Segabond

-1

Spero che sarà utile.

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

Perché usi la coda principale? –