Runloop应用实例
来源:互联网 发布:外贸企业搜索软件 编辑:程序博客网 时间:2024/05/15 10:18
AFNetworking
AFURLConnectionOperation 这个类是基于 NSURLConnection 构建的,其希望能在后台线程接收 Delegate 回调。为此 AFNetworking 单独创建了一个线程,并在这个线程中启动了一个 RunLoop:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
+ (void)networkRequestThreadEntryPoint:(id)__unused object {
@autoreleasepool {
[[NSThread currentThread] setName:@
"AFNetworking"
];
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
[runLoop run];
}
}
+ (NSThread *)networkRequestThread {
static NSThread *_networkRequestThread = nil;
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
_networkRequestThread = [[NSThread alloc] initWithTarget:self selector:@selector(networkRequestThreadEntryPoint:) object:nil];
[_networkRequestThread start];
});
return
_networkRequestThread;
}
RunLoop 启动前内部必须要有至少一个 Timer/Observer/Source,所以 AFNetworking 在 [runLoop run] 之前先创建了一个新的 NSMachPort 添加进去了。通常情况下,调用者需要持有这个 NSMachPort (mach_port) 并在外部线程通过这个 port 发送消息到 loop 内;但此处添加 port 只是为了让 RunLoop 不至于退出,并没有用于实际的发送消息。
1
2
3
4
5
6
7
8
9
10
- (void)start {
[self.lock lock];
if
([self isCancelled]) {
[self performSelector:@selector(cancelConnection) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]];
}
else
if
([self isReady]) {
self.state = AFOperationExecutingState;
[self performSelector:@selector(operationDidStart) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]];
}
[self.lock unlock];
}
当需要这个后台线程执行任务时,AFNetworking 通过调用 [NSObject performSelector:onThread:..] 将这个任务扔到了后台线程的 RunLoop 中。
0 0
- Runloop应用实例
- 实例化讲解 RunLoop
- RunLoop原理和实例
- RunLoop应用场景
- RunLoop应用篇--定时器
- RunLoop的应用
- IOS---实例化讲解RunLoop
- RunLoop的原理和应用
- RunLoop的原理和应用
- 多线程 - 13.RunLoop应用场景
- RunLoop在项目中的应用
- RunLoop 总结:RunLoop的应用场景(一)
- RunLoop 总结:RunLoop的应用场景(二)
- RunLoop总结:RunLoop的应用场景(三)
- RunLoop总结:RunLoop的应用场景(四)
- RunLoop总结:RunLoop的应用场景(五)
- RunLoop 总结:RunLoop的应用场景(二)
- RunLoop总结:RunLoop的应用场景(三)
- JSON解析和XML解析
- 归并排序与逆序数
- phpMyAdmin配置记录
- 虚函数的工作原理--虚函数表
- 剑指offer系列之7:斐波那契数列
- Runloop应用实例
- 数据库分区初识
- 笔记练习:《Javascript入门经典(第5版)》page138_11.8_Practice
- JVM类加载过程
- Android中的回调函数callback的使用
- 引用和指针的区别
- sdau-2 1008
- 隔离器厂家
- Android Studio 快捷键