在多線程的編程環境中,鎖的使用必不可少!html
使用時,基本方法就是:編程
[lock lock]; // 加鎖api
[obj yourMethod]; // 處理你的操做多線程
[lock unlock]; // 解鎖
app
API :測試
lockBeforeDate: 方法fetch
- (BOOL)lockBeforeDate:(NSDate *)limitspa
在指定的時間之前獲得鎖。YES:在指定時間以前得到了鎖;NO:在指定時間以前沒有得到鎖。線程
該線程將被阻塞,直到得到了鎖,或者指定時間過時。htm
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 還在鏈接,若離開,須要清空本房間的數據,監測到重連 在開啓事務