频道栏目
首页 > 程序开发 > 移动开发 > IOS > 正文
iOS开发之Block实现同异步加载
2015-09-01 10:19:46         来源:一木呈广矛  
收藏   我要投稿

一. 相关知识

1.控制层

负责数据的交互.控制层请求数据,会创建一个具有网络请求的对象.对象中有一个block,block会将请求到的数据回调给控制层.

2.数据的传输过程

Request(请求到数据后) 回调给Controller

 

二. 数据同步加载

思想:

Request对象负责下载网络数据.Controller中需要下载的数据,但直接在Controller中实现下载功能,不是一种好的习惯.采取在Request中实现下载功能,同时设置block属性,将下载数据回调给Controller(前提是Controller中实现了block).在Controller中定义一个Request对象,负责下载数据.数据下载后,会执行block,而block是在Controller中实现的,故下载数据可以Controller中使用.

 

Request.h //数据请求 负责加载数据 通过block将加载信息回调给Controller
#import 

@interface Request : NSObject
//data负责存储请求的数据 error 负责存储操作失误的信息 目的 功能设计的用户友好
//功能失败时给用户提供失败信息
@property (nonatomic, copy) void(^block)(NSData * data, NSError * error);
//网络下载方法
- (void)requestDataFromUrl:(NSString *) url;

@end

Requset.m
#import Request.h

@implementation Request
@synthesize block = _block;

- (void)dealloc
{
    [_block release];
    [super dealloc];
}

- (void)requestDataFromUrl:(NSString *)url {
    //网络地址
    NSURL * URL = [NSURL URLWithString:url];
    
    //通过网络地址下载数据
    NSData * data = [NSData dataWithContentsOfURL:URL];
    
    //通过block将数据返回
    @try {
        //正常的数据请求
        //1.请求的数据不为空
        //2.请求的本身就是空的
        if (nil != data) {
            //通过调用block 将数据正常返回
            self.block(data, nil);
        } else  {
            //给予数据为空的提示
            NSError * error = [[NSError alloc] initWithDomain:@请求到得数据为空 code:404 userInfo:nil];
            
            self.block(nil, error);
            
            [error autorelease];
        }
        
    }
    @catch (NSException *exception) {
        //网络请求失败时
        //exception 抛出异常 当网络请求本身就不成功时 里面包含了操作失败
        
        NSError * error = (NSError *)exception;
        
        self.block(nil, error);
    }
}

@end

Controller.h
#import Controlller.h
#import Request.h

@implementation Controlller {
    
    Request * _request;
}

- (void)viewDidLoadWithURL:(NSString *)url {
    
    //给网络属性赋值
    _request = [[Request alloc] init];
    
    //做好回调数据的接受准备
    //1.创建block 2.让request block指向创建的block
    
    _request.block = ^(NSData * data, NSError * error) {
        
        if (nil != data) {
            NSString * str = [[NSString alloc] initWithData:data  encoding:NSUTF8StringEncoding];
            NSLog(@%@, str);
            [str release];
        } else {
            NSLog(@%@, error.localizedDescription);
        }
    };

    [_request requestDataFromUrl:url];
}

- (void)dealloc
{
    [_request release];
    [super dealloc];
}
@end

Controller.m
#import Controlller.h
#import Request.h

@implementation Controlller {
    
    Request * _request;
}

- (void)viewDidLoadWithURL:(NSString *)url {
    
    //给网络属性赋值
    _request = [[Request alloc] init];
    
    //做好回调数据的接受准备
    //1.创建block 2.让request block指向创建的block
    
    _request.block = ^(NSData * data, NSError * error) {
        
        if (nil != data) {
            NSString * str = [[NSString alloc] initWithData:data  encoding:NSUTF8StringEncoding];
            NSLog(@%@, str);
            [str release];
        } else {
            NSLog(@%@, error.localizedDescription);
        }
    };

    [_request requestDataFromUrl:url];
}

- (void)dealloc
{
    [_request release];
    [super dealloc];
}
@end

主函数
#import 
#import Controlller.h
#define URL @https://Mrshang110.local/Demo/1.txt

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //创建对象
        Controlller * ctr = [[Controlller alloc] init];
        
        //调用接口
        [ctr viewDidLoadWithURL:URL];
        
        [ctr release];
    }
    return 0;
}

三. 异步加载

 

 

#import 
#import Controller.h
#define URL @https://Mrshang110.local/Demo/1.txt

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        Controller * ctr = [[Controller alloc] init];
        [ctr viewDidLoadWithUrl:URL];
        [ctr release];
        
        sleep(1);
    }
    return 0;
}

#import 

@interface Controller : NSObject

- (void)viewDidLoadWithUrl:(NSString *)url;

@end

#import Controller.h
#import Request.h

@implementation Controller {
    Request *  _request;
}


- (void)viewDidLoadWithUrl:(NSString *)url {
    
    if (nil == _request) {
        _request = [[Request alloc] init];
    }
    
    _request.block = ^(NSData * data, NSError * error) {
        
        if (nil != data) {
            NSString * str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@%@, str);
            [str release];
        } else {
            NSLog(@%@, error.localizedDescription);
        }
    };
    
    [_request requestDataWithUrl:url];
}

- (void)dealloc
{
    [_request release];
    [super dealloc];
}

@end

#import 

@interface Request : NSObject

@property (nonatomic,copy) void(^block)(NSData * data, NSError * error);
//声明一个方法用于数据下载
- (void)requestDataWithUrl:(NSString *)url;
@end

#import Request.h

@implementation Request
@synthesize  block = _block;

- (void)requestDataWithUrl:(NSString *)url {
    
    NSURL * URL = [NSURL URLWithString:url];
    //创建分线程去请求数据 数据请求完回到主线程
    //NSThread 线程类 其对象是一个分线程 分线程可以从主线程独立出来 将结果通知主线程
    //主线程 和 分线程同时执行
    NSThread * thread = [[NSThread alloc] initWithTarget:self selector:@selector(download:) object:URL];
    //download 是一个带参数的方法 其网络请求下固定为URL
    //创建分线程thread 去执行当前类的对象方法download
    //目的 分线程中下载数据
    
    
    /*
     启
     动
     分
     线
     程
     */
    
    [thread start];
}

- (void)download:(NSURL *)url {
    //分线程需要执行的代码
    
    //创建NSData 存储下载数
    NSData * data = [NSData dataWithContentsOfURL:url];
    
    //处理请求到的数据
    @try {
        //正常的数据返回
        if (nil != data) {
            self.block(data, nil);
        } else {
            NSError * error = [[NSError alloc] initWithDomain:@请求数据为空 code:404 userInfo:nil];
            self.block(nil, error);
        }
    }
    @catch (NSException *exception) {
        //网络请求本身错误时
        NSError * error = (NSError *)exception;
        self.block(nil, error);
    }
}

- (void)dealloc
{
    [_block release];
    [super dealloc];
}

@end


 

点击复制链接 与好友分享!回本站首页
相关TAG标签
上一篇:iOS 状态栏(UIStatusBar)的相关设置
下一篇:iOS Today Extension/widget编程小记
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站