最近做一个项目,之前的用户登录是同步的,点击登录后,在登录结果还没有返回之前所有的界面都不能操作,用户体验非常不好。所以使用NSOperationQueue以异步方式处理了。
///.h
#import <Foundation/Foundation.h>
@interface MyTask : NSOperation {
id _target;
SEL _action;
}
- (id)initWithTargetAndAction:(id)theTarget action:(SEL)theAction;
@end
///.m文件
- (id)initWithTargetAndAction:(id)theTarget action:(SEL)theAction {
self = [super init];
if (self) {
_action = theAction;
_target = theTarget;
}
return self;
}
- (void)main {
//发送请求命令
}
- (void)recvData:(id)data {
[_target performSelectorOnMainThread:_action withObject:nil waitUntilDone:NO];
}
// 调用地方LoginVIew.m
- (void)sendReq {
[self startAnima];
NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease];
MyTask *task = [[MyTask alloc] initWithTargetAndAction:self action:@selector(didFinish:)];
[queue addOperation:task];
}
-(void)didFinishIn:(id)data {
[self stopAnima];
}
本实例主要处理刷新进度条的显示和隐藏的处理,同时也是登录按钮的异步(之前不采用异步的话,点击按钮后就假死状态)。 本主要使用NSOperationQueue实现异步处理:开始的时候建立target和action相关动作。由main函数启动了一个子线程,相关处理在子线程中完成. 接收完成调用recvData函数。通过recvData函数通知到上层。从而实现异步处理。