zoukankan      html  css  js  c++  java
  • 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 还在连接,若离开,需要清空本房间的数据,监测到重连 在开启事务 

  • 相关阅读:
    hdu1754:I Hate It
    hdu1166
    bzoj1642:挤奶时间
    线段树
    bzoj1699:排队
    bzoj3438: 小M的作物
    bzoj2127: happiness
    bzoj2768[JLOI2010]冠军调查
    bzoj1070[SCOI2007]修车
    bzoj1305[CQOI2009]dance跳舞
  • 原文地址:https://www.cnblogs.com/tangyuanby2/p/10815639.html
Copyright © 2011-2022 走看看