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 還在連接,若離開,需要清空本房間的數據,監測到重連 在開啟事務 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM