代码改变世界

异步网络请求

2016-04-29 15:19  甘雨路  阅读(271)  评论(0编辑  收藏  举报
#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;


@end
#import "AppDelegate.h"
#import "RootViewController.h"
@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    
    self.window.rootViewController = [[RootViewController alloc] init];
    
    [self.window makeKeyAndVisible];
    return YES;
}

@end
#import <UIKit/UIKit.h>

@interface RootViewController : UIViewController


@end
#import "RootViewController.h"
#import "LFRequestData.h"
@interface RootViewController ()<NSURLConnectionDataDelegate,LFRequestDataDelegate>//导入代理
{
    NSMutableData *newsData;//存放数据
}
@end

@implementation RootViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    LFRequestData *requestData = [[LFRequestData alloc] initWithURLString:@"http://c.m.163.com/nc/article/list/T1370583240249/0-20.html"];
    //确定代理
    requestData.delegate = self;
}

#pragma mark -- LFRequestDataDelegate --
- (void)revieceData:(NSMutableData *)data{
//    NSLog(@"接受到数据了:%@",data);
    
    //解析
    NSDictionary *news = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
    NSLog(@"%@",news);
}

@end
#import <Foundation/Foundation.h>

@protocol LFRequestDataDelegate ; //协议的申明
@interface LFRequestData : NSObject

@property (nonatomic , weak) id<LFRequestDataDelegate> delegate;//设置代理
@property (nonatomic , strong) NSMutableData *newsData;//存放数据 

/**
 *  初始化的方法
 *
 *  @param URLString 网址
 */
- (LFRequestData*)initWithURLString:(NSString*)URLString;

@end

/**
 *  代理传值
 */
@protocol LFRequestDataDelegate <NSObject>

- (void)revieceData:(NSMutableData*)data;

@end
#import "LFRequestData.h"

@interface LFRequestData ()<NSURLConnectionDataDelegate>//导入代理
{
    NSString *URLStr;
}
@end

@implementation LFRequestData

- (LFRequestData*)initWithURLString:(NSString*)URLString{
    //如果URLString则返回空
    if (URLString.length == 0) {
        return nil;
    }
    URLStr = URLString;
    return [self init];
}

-(instancetype)init{
    self = [super init];
    if (self) {
        //1.创建URL
        NSURL *url = [[NSURL alloc] initWithString:URLStr];
        //2.通过URL创建网络请求
        NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
        //3.创建链接
        NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
        NSLog(@"connection:%@",connection);
    }
    return self;
}

/**
 *  服务器响应的时候自动执行
 */
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    NSHTTPURLResponse *HTTPResopnse = (NSHTTPURLResponse *)response;
    NSLog(@"code:%ld",(long)HTTPResopnse.statusCode);
    //如果状态码是200,则响应服务器了
    if (HTTPResopnse.statusCode == 200) {
        //初始化newsData
        self.newsData = [[NSMutableData alloc] init];
    }
}

/**
 *  如果有新的数据到来,此方法自动执行
 */
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    //追加新数据
    [self.newsData appendData:data];
}

/**
 *  请求完成后,自动执行的方法
 */
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
//    NSLog(@"%@",self.newsData);
    //如果能响应代理的方法,则执行代理的方法
    if ([_delegate respondsToSelector:@selector(revieceData:)]) {
        [self.delegate revieceData:self.newsData];
    }
}

/**
 *  请求失败时自动执行
 */
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    NSLog(@"error:%@",[error localizedFailureReason]);
}

@end