iOS开发之Block实现同异步加载

一. 相关知识

1.控制层

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

2.数据的传输过程

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

二. 数据同步加载

思想:

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

<span style="font-size:18px;">Request.h //数据请求 负责加载数据 通过block将加载信息回调给Controller</span>
<span style="font-size:18px;">#import <Foundation/Foundation.h>

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

@end
</span>
<span style="font-size:18px;">Requset.m</span>
<span style="font-size:18px;">#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
</span>
<span style="font-size:18px;">Controller.h</span>
<span style="font-size:18px;">#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

</span>
<span style="font-size:18px;">Controller.m</span>
<span style="font-size:18px;">#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</span>
<span style="font-size:18px;">主函数</span>
<span style="font-size:18px;">#import <Foundation/Foundation.h>
#import "Controlller.h"
#define URL @"http://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;
}
</span>

三. 异步加载

<span style="font-size:18px;">#import <Foundation/Foundation.h>
#import "Controller.h"
#define URL @"http://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 <Foundation/Foundation.h>

@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 <Foundation/Foundation.h>

@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</span>

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-25 07:03:13

iOS开发之Block实现同异步加载的相关文章

iOS开发之Block

iOS开发之Block 1.block的含义和作用 UI开发和网络常见功能实现回调, 按钮的事件处理方法是回调方法, 网络下载后的回调处理 (1) 按钮 target-action 一个方法传入按钮中 (2) 表格视图 传入一个指针self, 回调视图控制器中的方法 (3) block 语句块, 解决回调, 理解为"匿名函数", 定义在方法里面 2.block的基本使用(语法) 涉及知识点: 定义block变量,定义block语句块 block参数和返回值 block捕获外部变量(包括

李洪强iOS开发之Block和协议

李洪强iOS开发之Block和协议 OC语言BLOCK和协议 一.BOLCK (一)简介 BLOCK是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. BOLCK和函数的相似性:(1)可以保存代码(2)有返回值(3)有形参(4)调用方式一样. 标识符 ^ (二)基本使用 (1)定义BLOCK变量 Int (^SumBlock)(int,int);//有参数,返回值类型为int Void (^MyBlock)()://无参数,返回值类型

python web开发之flask框架学习(2) 加载模版

上次学习了flask的helloword项目的创建,这次来学习flask项目的模版加载: 第一步:创建一个flask项目 第二步:在项目目录的templates文件夹下创建一个html文件 第三步: 加载模版文件这里会用到flask包下的一个模版渲染器render_template因此要倒入这个render_template 第四步:运行项目就可以看到模版加载的效果了 以上就是flask框架的模版加载学习了,有什么问题欢迎留言! 简书地址: Code人生 原文地址:https://www.cnb

ios开发之block的使用,及注意事项

转自:http://my.oschina.net/u/1432769/blog/390401 Block作为C语言的扩展,并不是高新技术,和其他语言的闭包或lambda表达式是一回事.需要注意的是由于Objective-C在iOS中不支持GC机制,使用Block必须自己管理内存,而内存管理正是使用Block坑最多的地方,错误的内存管理 要么导致return cycle内存泄漏要么内存被提前释放导致crash. Block的使用很像函数指针,不过与函数最大的不同是:Block可以访问函数以外.词法

iOS开发之block解析

1. block的本质是一个Objective-C的对象.为什么这么说? 在Objective-C中.runtime会在执行时依据对象的isa指针的指向,来度额定这个对象的类型.也能够觉得一个对象.它具有isa指针.就是一个OC对象 2. 你怎么知道block有isa指针呢.我们能够通过clang命令将来看block的实现 //測试代码 int main(int argc, const char * argv[]) { @autoreleasepool { void(^blk)(void)=^{

IOS开发之block应用

非常长时间都是在学习各位大神的力作,并汲取了不少养料,在此一并谢过各位大神了. 当然了.好东西是要跟大家一起分享的,近期发现了几个很不错的个人网站,都是介绍IOS开发的.当中有唐巧.破船之长.池建强.王维等各位,当中不乏供职于腾讯和阿里这种IT巨头.希望大家也能从他们的博客中学习到一些技术之外的东西. 就不再啰嗦啦,附上地址:http://www.ityran.com/archives/4647 这几天在学习IOS7 CookBook.由于没有找到中文版.就硬着头皮啃原著吧.还真学到了不少东西,

iOS开发之XML解析代码

iOS开发之XML解析代码 //1.加载和解析XML文件 NSString *path = [[NSBundle mainBundle] pathForResource:@"xml.txt" ofType:nil]; NSData *data = [[NSData alloc] initWithContentsOfFile:path]; // GDataXMLDocument 表示XML文档对象 // initWithData 使用NSData初始化, 就是解析 GDataXMLDoc

IOS开发之XML解析以及下拉刷新上拉加载更多的分享

IOS开发之XML解析 1.XML格式 <?xml version="1.0" encoding="utf-8" ?> 表示XML文件版本, 内部文本使用的编码 <root> 表示根节点 <CityName>北京</CityName>  一个结点, CityName是结点名, 北京结点值 <Item key="1" value="A"></Item>  

iOS开发swift版异步加载网络图片(带缓存和缺省图片)

iOS开发之swift版异步加载网络图片 与SDWebImage异步加载网络图片的功能相似,只是代码比较简单,功能没有SD的完善与强大,支持缺省添加图片,支持本地缓存. 异步加载图片的核心代码如下:  func setZYHWebImage(url:NSString?, defaultImage:NSString?, isCache:Bool){         var ZYHImage:UIImage?         if url == nil {             return