多线程与基类

-(void)click:(UIButton *)button{  

NSInteger count=0;

//线程卡死

for (NSInteger i=0; i<100000000; i++) {

count++;

NSLog(@"%ld",count);}

NSLog(@"%ld",count);}


#pragma mark 第一种解决线程问题的方法 NSObject提供的方法

-(void)NSObjectThread:(UIButton *)button{

[self performSelectorInBackground:@selector(click:) withObject:button];  

//优点:写法特别简单,能够快速开辟一个临时的线程

//缺点:不能保证线程使用时候的数据安全}


#pragma mark 第二种方式 NSThread

-(void)NSTreadAction:(UIButton *)button{

//NSTread本身就是一个线程类,他可以控制线程休眠或创建

//当前的主线程

NSLog(@"%@",[NSThread currentThread]);  

//主线程休眠3

[NSThread sleepForTimeInterval:3];

NSLog(@"1111");   

//如果用NSThread创建对象,创建出来的就是新的线程

NSThread *thread=[[[NSThread alloc] initWithTarget:self selector:@selector(click:) object:nil] autorelease];

//可以给新的线程对象起名

thread.name=@"xiaowangzi";

//启动子线程

[thread start]; 

//优点:可以直接通过创建的方式控制线程

//缺点:什么都需要手动设置,包括名,开始,太麻烦}


#pragma mark 第三种,NSOperation 任务

-(void)operationAction:(UIButton *)button{    

//NSOperation 是一个抽象类,如果想使用这个抽象类必须创建一个他的子类

MyOperation *operation=[[MyOperation alloc] init];[operation start];

//它不能单独拿出来使用,如果单独使用和之前不考虑主线程的方式是一样的会卡死主线程,他一般和NSOperationQueue一起使用}

-(void)operationQueue:(UIButton *)button{   

//队列和任务一起配合使用解决多线程问题   

//队列:队列中通过哟个线程来管理所有闲置的线程,这样可以提高线程的重用利用率,避免重复的创建线程,整合资源

//优点:内部不需要关心线程的安全问题,用起来相对简单

//缺点:效率稍微有点低 

NSOperationQueue *queue=[[NSOperationQueue alloc] init];

//设置最大并发数

[queue setMaxConcurrentOperationCount:2];

MyOperation *op1=[[MyOperation alloc] init];

MyOperation *op2=[[MyOperation alloc] init];

MyOperation *op3=[[MyOperation alloc] init];

MyOperation *op4=[[MyOperation alloc] init];

MyOperation *op5=[[MyOperation alloc] init];    

//把任务加到队列中

[queue addOperation:op1];

[queue addOperation:op2];

[queue addOperation:op3];

[queue addOperation:op4];

[queue addOperation:op5];   }

-(void)GCDAction:(UIButton *)button{

//GCD是苹果提供的一种处理多线程的解决方案,整体比较好,operationQueue两种常见的解决方案问题的方法  

这个方法可以保存无论哪个线程执行都会只执行一次

static dispatch_once_t oneToken;

dispatch_once(&oneToken, ^{       });

//自定义一个队列

//第一个参数:给队列起一个名

//第二个参数:设置队列并行

dispatch_queue_t myQueue=dispatch_queue_create("xiaowangzi",DISPATCH_QUEUE_CONCURRENT);

//接下来,可以在队列里进行一些任务

dispatch_async(myQueue, ^{

//任务写在block

NSInteger count=0;

for (NSInteger i=0; i<6000000; i++) {

count++;

}

NSLog(@"%ld",count);

});   

//网络请求一般会在子线程里进行加载,但是现实这个数据都是在主线程里进行,所以需要把请求的数据放到主线程使用  

//定义一个全局的队列

//第一个参数:设置当前队列优先

//第二个参数:没实际含义,留着以后用

dispatch_queue_t globalQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//在获取一下当前的主队列,也就是主线程

dispatch_queue_t mainQueue=dispatch_get_main_queue(); 

//通过异步进行数据请求

dispatch_async(globalQueue, ^{

//通过网址请求图片数据

NSString *picStr=@"http://img4.duitang.com/uploads/item/201207/28/20120728105310_jvAjW.thumb.600_0.jpeg";

NSURL *url=[NSURL URLWithString:picStr];

NSData *data=[NSData dataWithContentsOfURL:url];

UIImage *image=[UIImage imageWithData:data];        

//把请求下来的数据加到主线程进行刷新

dispatch_async(mainQueue, ^{

//刷新数据

self.myImageView.image=image;

});      });  }


//基类

首先把AFNetWorking的网上数据请求进行封装

AFNetWorkingHandle.h

typedef void(^Block)(id result);

@interface AFNetWorkHandle : NSObject

+(void)GetWithAFNByURL:(NSString *)urlStr completion:(Block )block;


AFNetWorkingHandle.m

+(void)GetWithAFNByURL:(NSString *)urlStr completion:(Block )block{

AFHTTPRequestOperationManager *manager=[AFHTTPRequestOperationManager manager];

//设置响应解析函数

manager.responseSerializer=[AFHTTPResponseSerializer serializer];   

//设置AFN对应支持的类型

[manager.responseSerializer setAcceptableContentTypes:[NSSet setWithObjects:@"text/json",@"text/html",@"text/css",@"text/javas",@"application/json",@"text/javascript", nil]];  

[manager GET:urlStr parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

//responseObject返回的是一个NSData.所以要手动进行json解析

id result=[NSJSONSerialization JSONObjectWithData:responseObject options:0 error:nil];      

//block把网络请求下来的内容返回给调用的文件

block(result);      

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

NSLog(@"%@",error);

}];}

然后再来对解析进行封装.写一个多态
BaseModel.h

+(NSMutableArray *)baseModelByArr:(NSArray *)arr;

BaseModel.m

+(NSMutableArray *)baseModelByArr:(NSArray *)arr{    

//创建一个数组,用来装model

NSMutableArray *modelArr=[NSMutableArray array];  

//对数组进行遍历,里面的元素都是字典

for (NSDictionary *dic in arr) {

@autoreleasepool {

//直接通过便利构造器的方式创建对象,把对象添加到数组中.

[modelArr addObject:[[self class] baseModelWithDic:dic]];

}

}

return modelArr;

}

#pragma mark 便利构造器方法用来创建对象

+(instancetype)baseModelWithDic:(NSDictionary *)dic{

//获取当前的类型self class

//采用多态的方式进行对象的创建

id model=[[[[self class]alloc] initWithDic:dic] autorelease];

return model;}

#pragma mark 自定义初始化方法用来实现对modelKVC进行赋值

-(instancetype)initWithDic:(NSDictionary *)dic{

self=[super init];

if(self){

//KVC的方式进行成员变量的赋值

[self setValuesForKeysWithDictionary:dic];}

return  self;}

-(void)setValue:(id)value forUndefinedKey:(NSString *)key{}


再然后学一个类来继承BaseModel类来进行调用.

ViewController.m

[AFNetWorkHandle GetWithAFNByURL:@"http://mrobot.pconline.com.cn/v2/cms/channels/1?pageSize=20&pageNo=1" completion:^(id result) {

NSDictionary *dic=result;

NSMutableArray *arr=[Test baseModelByArr:dic[@"articleList"]];

for (Test *t in arr) {

NSLog(@"%@",t.title);}}];











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值