-(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;
+(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);
}];}
+(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 自定义初始化方法用来实现对model用KVC进行赋值
-(instancetype)initWithDic:(NSDictionary *)dic{
self=[super init];
if(self){
//用KVC的方式进行成员变量的赋值
[self setValuesForKeysWithDictionary:dic];}
return self;}
-(void)setValue:(id)value forUndefinedKey:(NSString *)key{}
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);}}];