NSLock的一些使用
在多线程的编程环境中,锁的使用必不可少!
使用时,基本方法就是:
[lock lock]; // 加锁
[obj yourMethod]; // 处理你的操作
[lock unlock]; // 解锁
API :
lockBeforeDate: 方法
- (BOOL)lockBeforeDate:(NSDate *)limit
在指定的时间以前得到锁。YES:在指定时间之前获得了锁;NO:在指定时间之前没有获得锁。
该线程将被阻塞,直到获得了锁,或者指定时间过期。
tryLock 方法
- (BOOL)tryLock
视图得到一个锁。YES:成功得到锁;NO:没有得到锁。
setName: 方法
- (void)setName:(NSString *)newName
为锁指定一个Name
name 方法
- (NSString *)name
返回锁指定的Name
我的一些使用: TCP 的一些场景
不管是握手,还是重连时的一些操作 都要用到锁
/**
* 握手请求
*/
- (void)responseHandShakeResult:(NSDictionary *)data
{
//重新加入房间 删除过去的数据
[self.playerList removeAllObjects];
//存储 进入房间的时间, 以及加入的token;
[_blockLock lock];
[self.callbackBlock removeObject:@(RoomStatus_HandShake_TimeOut)];
[_blockLock unlock];
/**
* 重连响应
*/
- (void)responseReconnectResult:(NSDictionary *)data
{
//重新加入房间 删除过去的数据
[self.playerList removeAllObjects];
//存储 进入房间的时间, 以及加入的token;
[_blockLock lock];
[self.callbackBlock removeObject:@(RoomStatus_Reconnect_TimeOut)];
[_blockLock unlock];
// DDLogError(@"responseReconnectResult result is :%@",data);
NSDictionary * connctStatusDic = [data objectForKey:RECONNECT_RESPONSE_STATUS];
NSNumber * connctStatus = [connctStatusDic objectForKey:CONNECTSTATUS_STATUS];
if(connctStatus.intValue == EUM_CONNECTSTATUS_OK){
NSString * recToken = [connctStatusDic objectForKey:CONNECTSTATUS_REC_TOKEN];
RLMRealm * realm = [[RealmConfiguration shared]realm];
// if(_createdRoom == nil){
GSpotRoom * createdRoom= [GSpotRoom objectInRealm:realm forPrimaryKey:_roomId];
// }
[realm beginWriteTransaction];
-(void)addTimeOutCheck:(NSNumber *)key
{
[_blockLock lock];
[self.callbackBlock addObject:key];
[_blockLock unlock];
// 5 秒超时, 找到 key 删除
WS(weakSelf);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[weakSelf timerRemove:key];
});
}
- (void)timerRemove:(NSNumber *)key {
if (key) {
[_blockLock lock];
BOOL hasKey = [self.callbackBlock containsObject:key];
if(hasKey && key.intValue == RoomStatus_check_Connect_TimeOut){
NSInteger index = [self.callbackBlock indexOfObject:key];
if(index!=NSNotFound){
NSNumber * timeOffset = [self.callbackBlock objectAtIndex:(index+1)];
long newTimeOffset = [_api timeStampOffset];
if(timeOffset.longValue == newTimeOffset){ //默认 测试消息 没有发送成功。 毫秒值很难 出现连续两次一样的值,只有 没有更新的时候 才会一样。
self.isLogin = false; //认为链接 已经断开了
}
}
return;
}
[self.callbackBlock removeObject:key];
[_blockLock unlock];
if (hasKey == false) {
return;
}
if(self.callBack){
NSArray * result = [NSArray arrayWithObjects:_roomId,key, nil];
[self.callBack fetchOK: result];
}
}
}
接收,发送数据,需要判断是否TCP 还在连接,若离开,需要清空本房间的数据,监测到重连 在开启事务
NSLock的一些使用的更多相关文章
- NSLock线程锁的使用测试
测试1:NSLock线程锁是不是单例? 打印: 结论1:NSLock不是单例 测试2:同一个线程锁在不同的地方锁定,是否会有锁定两个? 打印为: 结论2:顺序打印,在不同的地方锁定也可以锁定. 测试3 ...
- NSLock/NSRecursiveLock/NSConditionLock/@synchronized
NSLock/NSRecursiveLock/NSConditionLock/@synchronized http://blog.sina.com.cn/s/blog_8c87ba3b0101ok8y ...
- Object-C 多线程中锁的使用-NSLock
在多线程的编程环境中,锁的使用必不可少! 于是,今天来总结一下为共享资源加锁的操作方法. 一.使用synchronized方式 //线程1 dispatch_async(dispatch_ge ...
- 【原】AFNetworking源码阅读(三)
[原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...
- AFNetworking 3.0 源码解读 总结(干货)(下)
承接上一篇AFNetworking 3.0 源码解读 总结(干货)(上) 21.网络服务类型NSURLRequestNetworkServiceType 示例代码: typedef NS_ENUM(N ...
- AFNetworking 3.0 源码解读(九)之 AFNetworkActivityIndicatorManager
让我们的APP像艺术品一样优雅,开发工程师更像是一名匠人,不仅需要精湛的技艺,而且要有一颗匠心. 前言 AFNetworkActivityIndicatorManager 是对状态栏中网络激活那个小控 ...
- AFNetworking 3.0 源码解读(四)之 AFURLResponseSerialization
本篇是AFNetworking 3.0 源码解读的第四篇了. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager AFNetworking 3 ...
- AFNetworking 3.0 源码解读(五)之 AFURLSessionManager
本篇是AFNetworking 3.0 源码解读的第五篇了. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager AFNetworking 3 ...
- 修改版: 小伙,多线程(GCD)看我就够了,骗你没好处!
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能.具有这种能力的系 ...
随机推荐
- vsCode设置代码片段
输入vue.json { "Print to console": { "prefix": "vv", "body": [ ...
- js对象中属性调用.和[] 两种方式的区别
JS 调用属性一般有两种方法——点和中括号的方法. 标准格式是对象.属性(不带双引号),注意一点的是:js对象的属性,key标准是不用加引号的,加也可以,特别的情况必须加,如果key数字啊,表达式啊等 ...
- 关于写SQL语句的技巧
一.SQL总结写法 SQL的写法无非就是几种,关联查询,子查询,分组函数,各种函数的使用 1.首先根据要做的需求,先分析一下,需要用到哪些查询,例如要用到关联查询,就先把用到的表列出来,比如a,b,c ...
- composer安装学习
Packagist 镜像 网站地址 http://www.phpcomposer.com/ 请各位使用本镜像的同学注意: 本镜像已经依照 composer 官方的数据源安全策略完全升级并支持 http ...
- 打印n对括号的全部有效组合(左右括号正确匹配)Java实现
一.问题导出 今天在做算法题目的时候遇到了一道左右括号匹配的问题,问题如下: 二.问题思考 (1)这种要列出全部可能性的题目很容易想到由小到大去发现规律,用递归或者暴力搜索. 首先1的情况,一个括号只 ...
- Mysql(三):表操作
一 存储引擎介绍 存储引擎即表类型,mysql根据不同的表类型会有不同的处理机制 详见:http://www.cnblogs.com/6324TV/p/8481061.html 二 表介绍 表相当于文 ...
- 5.安装bacula-web(监控页面)
1. 安装bacula-web(监控页面) 用途:监控bacula状态. http://docs.bacula-web.org/en/master/index.html bacula-web-7. ...
- Django模型层:单表操作,多表操作,常用(非常用)字段和参数,Django-model进阶
一.web应用 二.模板的导入与继承 三.静态文件相关 四.inclusion_tag:返回html片段 五.模型层 一.web应用 -s包括两个部分:web服务器+application -目前阶段 ...
- unomp 矿池运行问题随记
经过大量的实践,遇到的问题或经验如下: 1.单机运行多矿池时,单机CPU核心数 成为性能瓶颈,运行两个月后,有部分用户反映 矿机速率只有以前的一半. 2.Dash 等可以自行报块的矿池,每个块的股份比 ...
- Pycharm中查看内置函数的源码
方法1.鼠标放在函数上,Ctrl+B,看源码 方法2.将光标移动至要查看的方法处,按住ctrl 键,点击鼠标左键,即可查看该方法的源码.