RunLoop 的实际应用举例-AFNetworking
来源:互联网 发布:淘宝如何做全屏首页 编辑:程序博客网 时间:2024/05/08 04:03
AFURLConnectionOperation 这个类是基于 NSURLConnection 构建的,其希望能在后台线程接收 Delegate 回调。为此 AFNetworking 单独创建了一个线程,并在这个线程中启动了一个 RunLoop:
+ (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 不至于退出,并没有用于实际的发送消息。
- (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 的实际应用举例-AFNetworking
- Runloop 实际应用和详细解释
- Linux下打包压缩工具tar的实际应用举例
- RunLoop的应用
- EL在实际开发中的应用举例
- HTML5 localStorage本地存储实际应用举例
- HTML5 localStorage本地存储实际应用举例
- activemq应用场景-公司实际运用举例
- RunLoop的原理和应用
- RunLoop的原理和应用
- iOS-AFNetWorking的应用
- RunLoop的应用和RunLoop的面试题
- RunLoop 总结:RunLoop的应用场景(一)
- RunLoop 总结:RunLoop的应用场景(二)
- RunLoop总结:RunLoop的应用场景(三)
- RunLoop总结:RunLoop的应用场景(四)
- RunLoop总结:RunLoop的应用场景(五)
- RunLoop 总结:RunLoop的应用场景(二)
- Codeforces Round #353 (Div. 2) D. Tree Construction
- ios 开源的电子书阅读器项目
- 多线程的几种实现方式
- 通过Navicat for MySQL远程连接的时候报错mysql 1130的解决方法
- CocoaPods pod install/pod update更新慢的问题
- RunLoop 的实际应用举例-AFNetworking
- leetcode.164. Maximum Gap
- Mybatis 学习总结(八)——调用存储过程
- xp服务器下单网卡实现vpn+nat共享上网
- Could not add target because the target \"D:\\01-Work\\qixue\\dbjk\\dbjk.pbt\" could not be created.
- 喜欢静的我似乎感到了一点寂寞
- myeclipse 8.5 m2
- 蚁族遐想
- windows 7实现系统自动登录