NSURLConnection与块 [英] NSURLConnection with blocks

查看:62
本文介绍了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;

处理数据加载.一切正常,工作正常,但我不喜欢这段代码的美感

to handle data loading. Everything is ok and working fine but I don't like the beauty of this code )

我希望使用块,使我的代码看起来像这样:

I wish to use blocks, to make my code looks like this:

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

是否可以将NSURLConnection与块一起使用?

is it possible to use NSURLConnection with blocks?

推荐答案

我使用此类:

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

它基于《大书呆子牧场》在他的书中使用的代码.

It's based on the code, The Big Nerd Ranch uses on his book.

这篇关于NSURLConnection与块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆