在多线程的编程环境中,锁的使用必不可少!

使用时,基本方法就是:

[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的一些使用的更多相关文章

  1. NSLock线程锁的使用测试

    测试1:NSLock线程锁是不是单例? 打印: 结论1:NSLock不是单例 测试2:同一个线程锁在不同的地方锁定,是否会有锁定两个? 打印为: 结论2:顺序打印,在不同的地方锁定也可以锁定. 测试3 ...

  2. NSLock/NSRecursiveLock/NSConditionLock/@synchronized

    NSLock/NSRecursiveLock/NSConditionLock/@synchronized http://blog.sina.com.cn/s/blog_8c87ba3b0101ok8y ...

  3. Object-C 多线程中锁的使用-NSLock

    在多线程的编程环境中,锁的使用必不可少! 于是,今天来总结一下为共享资源加锁的操作方法.   一.使用synchronized方式   //线程1 dispatch_async(dispatch_ge ...

  4. 【原】AFNetworking源码阅读(三)

    [原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...

  5. AFNetworking 3.0 源码解读 总结(干货)(下)

    承接上一篇AFNetworking 3.0 源码解读 总结(干货)(上) 21.网络服务类型NSURLRequestNetworkServiceType 示例代码: typedef NS_ENUM(N ...

  6. AFNetworking 3.0 源码解读(九)之 AFNetworkActivityIndicatorManager

    让我们的APP像艺术品一样优雅,开发工程师更像是一名匠人,不仅需要精湛的技艺,而且要有一颗匠心. 前言 AFNetworkActivityIndicatorManager 是对状态栏中网络激活那个小控 ...

  7. AFNetworking 3.0 源码解读(四)之 AFURLResponseSerialization

    本篇是AFNetworking 3.0 源码解读的第四篇了. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager AFNetworking 3 ...

  8. AFNetworking 3.0 源码解读(五)之 AFURLSessionManager

    本篇是AFNetworking 3.0 源码解读的第五篇了. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager AFNetworking 3 ...

  9. 修改版: 小伙,多线程(GCD)看我就够了,骗你没好处!

    多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能.具有这种能力的系 ...

随机推荐

  1. redis 命令行操作报错

    向redis集群写数据抛异常:(error) MOVED 15342 2001:fecc:0:616::34:6383 原因是启动redis-cli时未以集群方式启动,即后面要加上 -c redis- ...

  2. 10.自定义EL函数和自定义标签

    需要在JSP页面中进行一些常见逻辑操作(如对字符串进行操作),首先考虑是否可以用到sun公司提供的EL函数库(fn.tld)和JSTL 核心标签库 如果sun公司的EL函数库没有或者无法满足,就需要自 ...

  3. 【loj#6220】sum

    题目传送门:https://loj.ac/problem/6220 题意:对于一个序列$a$,找出它的一个子序列$b$,使$\sum_{a_i \in b}a_i \equiv 0 \pmod n$ ...

  4. Hive2.0常用函数(对编辑器很无语😓)

    Hive内部提供了很多函数给开发者使用,包括数学函数,类型转换函数,条件函数,字符函数,聚合函数,表生成函数等等,这些函数都统称为内置函数. 参考:https://cwiki.apache.org/c ...

  5. org.apache.tomcat.util.descriptor.web.WebXml.setVersion Unknown version string [4.0]

    错误: 在 IDEA 创建WEB项目之后,打印出的日志中总是出现一行警告信息: 12-May-2018 15:52:30.692 警告 [RMI TCP Connection(3)-127.0.0.1 ...

  6. 构建之法第二次作业【使用git和Vs实现四则运算】

    [相关信息] Q A GIT地址 git地址 GIT用户名 Lin-000 学号后五位 62501 博客地址 博客地址 作业链接 此次作业链接 1.项目需求 程序接收一个命令行参数 n,然后随机产生 ...

  7. P1582 倒水 题解

    来水一发水题.. 题目链接. 正解开始: 首先,我们根据题意,可以得知这是一个有关二进制的题目: 具体什么关系,怎么做,我们来具体分析: 对于每个n,我们尝试将其二进制分解,也就是100101之类的形 ...

  8. Tomcat下配置JNDI的三种方式

    最近在整理项目上的配置文件,正好看到了数据源配置,想着配置方式有多种,便趁热打铁,记录下常规的Tomcat配置数据源的方式 1.单个工程配置 找到Tomcat下的server.xml文件,在Conte ...

  9. 《深入理解Java虚拟机》之(二、垃圾收集器与内存分配策略)

    程序计数器.虚拟机栈.本地方法栈3个区域随线程而生,随线程而灭,这几个区域的内存分配和回收都具备确定性,不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟着回收了,而java堆和方法区 ...

  10. So easy RHCE

    1.将VGSRV  拉伸为100MB  VGSRV这个是逻辑卷的home分区,逻辑卷是可以随意拉伸的,但是需要注意的是拉伸之前必须使用umount卸载,否则系统会崩溃,虽然可以还原但是很麻烦,顺序不可 ...