您的位置:首页 > 移动开发 > IOS开发

iOS多线程

2015-06-23 10:24 387 查看


1、NSThread

创建、启动线程

NSThread*thread = [[NSThreadalloc]
initWithTarget:selfselector:@selector(run)object:nil];

[thread start];

// 线程一启动,就会在线程thread中执行self的run方法

主线程相关用法
+ (NSThread *)mainThread; //获得主线程

- (BOOL)isMainThread; //是否为主线程

+ (BOOL)isMainThread; //是否为主线程

获得当前线程

NSThread*current = [NSThreadcurrentThread];

线程的调度优先级
+ (double)threadPriority;

+ (BOOL)setThreadPriority:(double)p;

- (double)threadPriority;

- (BOOL)setThreadPriority:(double)p;

调度优先级的取值范围是0.0~1.0,默认0.5,值越大,优先级越高

线程的名字
- (void)setName:(NSString
*)n;

- (NSString*)name;

创建线程后自动启动线程

[NSThreaddetachNewThreadSelector:@selector(run)toTarget:selfwithObject:nil];

隐式创建并启动线程
[selfperformSelectorInBackground:@selector(run)withObject:nil];

2、GCD



// 1.获得主队列

dispatch_queue_t queue = dispatch_get_main_queue();

// 2.添加任务到队列中 执行
异步

dispatch_async(queue, ^{

NSLog(@"----下载图片1-----%@", [NSThread currentThread]);

});

同步

dispatch_sync(queue, ^{

NSLog(@"----下载图片1-----%@", [NSThread currentThread]);

});

// .获得全局的并发队列

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

// 创建串行队列

dispatch_queue_t queue = dispatch_queue_create("com.itheima.queue", NULL);

例:图片的下载

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(queue, ^{

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

// 下载图片

NSURL *url = [NSURL URLWithString:@"http://news.baidu.com/z/resource/r/image/2014-06-22/2a1009253cf9fc7c97893a4f0fe3a7b1.jpg"];

NSData *data = [NSData dataWithContentsOfURL:url]; // 这行会比较耗时

UIImage *image = [UIImage imageWithData:data];

// 回到主线程显示图片

dispatch_async(dispatch_get_main_queue(), ^{

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

self.imageView.image = image;

});

});

3、NSOperation

get请求

NSString *urlStr = [NSString stringWithFormat:@"http://192.168.1.200:8080/MJServer/login?username=%@&pwd=%@", username, pwd];

// 转码

urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

// URL里面不能包含中文

NSURL *url = [NSURL URLWithString:urlStr];

// 2.2.创建请求对象

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; // 默认就是GET请求

request.timeoutInterval = 5; // 设置请求超时

// 2.3.发送请求

[self sendAsync:request];

/**

* 请求错误(失败)的时候调用(请求超时\断网\没有网, 一般指客户端错误)

*/

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

{

NSLog(@"connection:didFailWithError:");

}

/**

* 当接受到服务器的响应(连通了服务器)就会调用

*/

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

{

NSLog(@"connection:didReceiveResponse:");

// 初始化数据

self.responseData = [NSMutableData data];

}

/**

* 当接受到服务器的数据就会调用(可能会被调用多次, 每次调用只会传递部分数据)

*/

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

{

NSLog(@"connection:didReceiveData:");

// 拼接(收集)数据

[self.responseData appendData:data];

}

/**

* 当服务器的数据接受完毕后就会调用

*/

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

{

NSLog(@"connectionDidFinishLoading:");

// 解析服务器返回的数据

NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:self.responseData options:NSJSONReadingMutableLeaves error:nil];

NSString *error = dict[@"error"];

if (error) { // 登录失败

[MBProgressHUD showError:error];

} else { // 登录成功

NSString *success = dict[@"success"];

[MBProgressHUD showSuccess:success];

}

}

/**

* 发送异步请求的方式2: start方法, 代理

*/

- (void)sendAsync2:(NSURLRequest *)request

{

NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];

[conn start]; // 异步执行

}

/**

* 发送异步请求的方式1: 类方法, block

*/

- (void)sendAsync:(NSURLRequest *)request

{

NSOperationQueue *queue = [NSOperationQueue mainQueue];

[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { // 当请求结束的时候调用 (拿到了服务器的数据, 请求失败)

/**

解析data :

{"error":"用户名不存在"}

{"error":"密码不正确"}

{"success":"登录成功"}

*/

if (data) { // 请求成功

NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];

NSString *error = dict[@"error"];

if (error) { // 登录失败

[MBProgressHUD showError:error];

} else { // 登录成功

NSString *success = dict[@"success"];

[MBProgressHUD showSuccess:success];

}

} else { // 请求失败

[MBProgressHUD showError:@"网络繁忙, 请稍后再试"];

}

}];

}

post请求

// 2.1.设置请求路径

NSURL *url = [NSURL URLWithString:@"http://192.168.1.200:8080/MJServer/login"];

// 2.2.创建请求对象

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; // 默认就是GET请求

request.timeoutInterval = 5; // 设置请求超时

request.HTTPMethod = @"POST"; // 设置为POST请求

// 通过请求头告诉服务器客户端的类型

[request setValue:@"ios" forHTTPHeaderField:@"User-Agent"];

// 设置请求体

NSString *param = [NSString stringWithFormat:@"username=%@&pwd=%@", username, pwd];

request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding];

// 2.3.发送请求

NSOperationQueue *queue = [NSOperationQueue mainQueue];

[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { // 当请求结束的时候调用 (拿到了服务器的数据, 请求失败)

// 隐藏HUD (刷新UI界面, 一定要放在主线程, 不能放在子线程)

[MBProgressHUD hideHUD];

/**

解析data :

{"error":"用户名不存在"}

{"error":"密码不正确"}

{"success":"登录成功"}

*/

if (data) { // 请求成功

NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];

NSString *error = dict[@"error"];

if (error) { // 登录失败

[MBProgressHUD showError:error];

} else { // 登录成功

NSString *success = dict[@"success"];

[MBProgressHUD showSuccess:success];

}

} else { // 请求失败

[MBProgressHUD showError:@"网络繁忙, 请稍后再试"];

}

}];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: