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:@"网络繁忙, 请稍后再试"];
}
}];
相关文章推荐
- iOS(使用pch文件导入头文件方法)
- 构建iOS交叉编译环境
- iOS开发笔记6:图片轮播及其无限循环效果
- “自释放”在iOS开发中的应用
- iOS类的继承关系
- iOS view的frame和bounds之区别(位置和大小)
- bios基本原理
- IOS 加入购物车动画
- IOS 三级联想菜单(也可以当二级)
- iOS触摸事件
- 怎么样减少iOS应用程序的大小
- Kiosk 2 购物 WordPress主题[v2.2.6]
- IOS高级开发工程师
- IOS8 兼容本地推送
- IOS 单例方法的建立
- IOS 图片圆角设置
- IOS 转场动画
- IOS 内存管理小结
- IOS OC的消息结构 和 运行期组件
- Xamarin iOS教程之页面控件