2015-08-28 71 views
1

下面是每次收到揚聲器信息時調用的方法。NSMutableDictionary在實例化並初始化後仍然爲零

- (void)handleGroupingFromReceivedSpeakerInfo:(SpeakerInfo *)speakerInfo 
{ 
    GroupInfo *groupInfo = [_IP_GroupInfo_Map objectForKey:speakerInfo.mGroupIP]; 

    if(groupInfo == nil) 
    { 
     groupInfo = [[GroupInfo alloc] init]; 
     groupInfo.mIP = speakerInfo.mGroupIP; 
     groupInfo.isTemp = YES; 

     NSLog(@"HandleGrouping: New temp group %@", groupInfo.mIP); 
    } 

    if(groupInfo.isTemp) 
    { 
     if(![groupInfo.mSpeakerIDList containsObject:[@(speakerInfo.mID) stringValue]]) 
     { 
      [groupInfo.mSpeakerIDList addObject:[@(speakerInfo.mID) stringValue]]; 

      NSLog(@"HandleGrouping: added new member with id %@ temp group with ip %@", [@(speakerInfo.mID) stringValue], groupInfo.mIP); 

      [_IP_GroupInfo_Map setObject:groupInfo forKey:groupInfo.mIP]; 
     } 
    } 
} 

現在我來解釋一下代碼的作用。

  • 每當接收到一個揚聲器的信息,它會得到與密鑰獲得的存儲GroupInfospeakerInfo.mGroupIP

  • 如果GROUPINFO那麼簡單的實例化一個新的,然後將揚聲器信息的ID添加到groupInfo

  • 如果不是那麼去並添加speakerInfo到現有GroupInfo

好吧,這裏的問題,看看日誌(請不要介意其他日誌消息,只有開頭的一個「HandleGrouping:」 ):

Discovered speaker with id 6494094734139439904 
2015-08-28 17:41:53.756 soulbeats[13558:3307] Added speakerID: 6494094734139439904 to AllSpeakersIDList 
2015-08-28 17:41:53.758 soulbeats[13558:1803] Discovered speaker with id 72243140485806144 
2015-08-28 17:41:53.763 soulbeats[13558:3307] Old speaker info is null 
2015-08-28 17:41:53.765 soulbeats[13558:1803] Added speakerID: 72243140485806144 to AllSpeakersIDList 
2015-08-28 17:41:53.770 soulbeats[13558:3307] HandleGrouping: New temp group 239.11.11.12 
2015-08-28 17:41:53.772 soulbeats[13558:1803] Old speaker info is null 
2015-08-28 17:41:53.777 soulbeats[13558:3307] HandleGrouping: added new member with id 6494094734139439904 temp group with ip 239.11.11.12 
2015-08-28 17:41:53.779 soulbeats[13558:1803] HandleGrouping: New temp group 239.11.11.12 
2015-08-28 17:41:53.785 soulbeats[13558:3307] Discovered speaker with id 7782687177520836128 
2015-08-28 17:41:53.788 soulbeats[13558:1803] HandleGrouping: added new member with id 72243140485806144 temp group with ip 239.11.11.12 
2015-08-28 17:41:53.794 soulbeats[13558:3307] Added speakerID: 7782687177520836128 to AllSpeakersIDList 
2015-08-28 17:41:53.802 soulbeats[13558:3307] Old speaker info is null 
2015-08-28 17:41:53.807 soulbeats[13558:3307] HandleGrouping: added new member with id 7782687177520836128 temp group with ip 239.11.11.12 
2015-08-28 17:41:55.711 soulbeats[13558:60b] SendBrowseCmd: browse again!!! 
2015-08-28 17:41:55.719 soulbeats[13558:60b] SendBrowseCmd: refresh!!! 
2015-08-28 17:41:55.721 soulbeats[13558:60b] Refresh: found one temp group with ip 239.11.11.12 with speakerIDListCount 2 

正如從上面可以看到的,GROUPINFO被實例化兩次。您可以看到日誌消息「New temp group 239.11.11.12」出現TWICE

2015-08-28 17:41:53.770 soulbeats[13558:3307] HandleGrouping: New temp group 239.11.11.12 
2015-08-28 17:41:53.772 soulbeats[13558:1803] Old speaker info is null 
2015-08-28 17:41:53.777 soulbeats[13558:3307] HandleGrouping: added new member with id 6494094734139439904 temp group with ip 239.11.11.12 
2015-08-28 17:41:53.779 soulbeats[13558:1803] HandleGrouping: New temp group 239.11.11.12 

我不明白爲什麼會發生這種情況。我使用相同的密鑰獲取groupInfo對象,這是收到的speakerInfo的ip,239.11.11.12。所以我期待在第一次調用這個方法時,groupInfo應該是零。但在此之後,由於我已經在其中添加了speakerInfo.mID並將其重新設置爲字典,因此下次調用此方法時groupInfo不應該爲零。

其他信息:

我宣佈的NSMutableDictionary這樣:

@property (nonatomic, strong) NSMutableDictionary *IP_GroupInfo_Map; 

有什麼事要解決這個問題?請幫忙。非常感謝。

---------更新:新增的NSLog(@ 「%@」,個體經營)--------------

2015-08-28 18:41:28.497 soulbeats[13652:5d03] Discovered speaker with id 7782687177520836128 
2015-08-28 18:41:28.505 soulbeats[13652:1803] <MultiroomPlay: 0x1760ba90> 
2015-08-28 18:41:28.507 soulbeats[13652:3903] <MultiroomPlay: 0x1760ba90> 
2015-08-28 18:41:28.508 soulbeats[13652:5d03] Added speakerID: 7782687177520836128 to AllSpeakersIDList 
2015-08-28 18:41:28.516 soulbeats[13652:1803] HandleGrouping: New temp group 239.11.11.12 
2015-08-28 18:41:28.518 soulbeats[13652:3903] HandleGrouping: New temp group 239.11.11.12 
2015-08-28 18:41:28.519 soulbeats[13652:5d03] Old speaker info is null 
2015-08-28 18:41:28.527 soulbeats[13652:1803] HandleGrouping: added new member with id 6494094734139439904 temp group with ip 239.11.11.12 
2015-08-28 18:41:28.530 soulbeats[13652:3903] HandleGrouping: added new member with id 72243140485806144 temp group with ip 239.11.11.12 
2015-08-28 18:41:28.531 soulbeats[13652:5d03] <MultiroomPlay: 0x1760ba90> 
2015-08-28 18:41:28.543 soulbeats[13652:5d03] HandleGrouping: added new member with id 7782687177520836128 temp group with ip 239.11.11.12 

既然可以看到了,ID正好是SAME

-------另一個更新:添加的代碼在類的初始化-------

+ (MultiroomPlay *)getMultiroomPlay 
{ 
    static MultiroomPlay *sharedMultiroomPlay; 
    static dispatch_once_t onceToken; 

    dispatch_once(&onceToken, 
    ^{ 
     sharedMultiroomPlay = [[MultiroomPlay alloc] init]; 
    }); 

    return sharedMultiroomPlay; 
} 

- (id)init 
{ 
    self = [super init]; 

    if (self) 
    { 
     [self openSocket]; 

     _allSpeakersIDList = [[NSMutableArray alloc] init]; 
     _allPermGroupsIDList = [[NSMutableArray alloc] init]; 
     _allGroupsIPList = [[NSMutableArray alloc] init]; 
     _allUngroupedSpeakersList = [[NSMutableArray alloc] init]; 
     _allUngroupedPermGroupsList = [[NSMutableArray alloc] init]; 
     _allTempGroupsList = [[NSMutableArray alloc] init]; 
     _tempGroupMemberRemoveSeqList = [[NSMutableArray alloc] init]; 

     _ID_TCPConnection_Map = [[NSMutableDictionary alloc] init]; 
     _ID_SpeakerInfo_Map = [[NSMutableDictionary alloc] init]; 
     _ID_PermGroupInfo_Map = [[NSMutableDictionary alloc] init]; 
     _IP_GroupInfo_Map = [NSMutableDictionary dictionary]; // <--Look here 
     _IP_PlayerInfo_Map = [[NSMutableDictionary alloc] init]; 
     _IP_PlayBackTimer_Map = [[NSMutableDictionary alloc] init]; 
     _IP_FinishSeqNum_Map = [[NSMutableDictionary alloc] init]; 
    } 

    return self; 
} 

---------添加日誌中值的GroupInfo ------------

在適當的初始化方法
2015-08-28 19:07:29.043 soulbeats[13709:3307] Discovered speaker with id 6494094734139439904 
2015-08-28 19:07:29.046 soulbeats[13709:1803] Discovered speaker with id 72243140485806144 
2015-08-28 19:07:29.050 soulbeats[13709:3307] Added speakerID: 6494094734139439904 to AllSpeakersIDList 
2015-08-28 19:07:29.052 soulbeats[13709:1803] Added speakerID: 72243140485806144 to AllSpeakersIDList 
2015-08-28 19:07:29.058 soulbeats[13709:3307] Old speaker info is null 
2015-08-28 19:07:29.060 soulbeats[13709:1803] Old speaker info is null 
2015-08-28 19:07:29.066 soulbeats[13709:3307] <MultiroomPlay: 0x1460e920> 
2015-08-28 19:07:29.069 soulbeats[13709:1803] <MultiroomPlay: 0x1460e920> 
2015-08-28 19:07:29.074 soulbeats[13709:3307] Value of Groupinfo: (null) 
2015-08-28 19:07:29.076 soulbeats[13709:1803] Value of Groupinfo: (null) 
2015-08-28 19:07:29.081 soulbeats[13709:3307] HandleGrouping: New temp group 239.11.11.12 
2015-08-28 19:07:29.083 soulbeats[13709:1803] HandleGrouping: New temp group 239.11.11.12 
2015-08-28 19:07:29.089 soulbeats[13709:3307] HandleGrouping: added new member with id 6494094734139439904 temp group with ip 239.11.11.12 
2015-08-28 19:07:29.091 soulbeats[13709:1803] HandleGrouping: added new member with id 72243140485806144 temp group with ip 239.11.11.12 
2015-08-28 19:07:29.098 soulbeats[13709:3307] Discovered speaker with id 7782687177520836128 
2015-08-28 19:07:29.250 soulbeats[13709:3307] Added speakerID: 7782687177520836128 to AllSpeakersIDList 
2015-08-28 19:07:29.332 soulbeats[13709:3307] Old speaker info is null 
2015-08-28 19:07:29.380 soulbeats[13709:3307] <MultiroomPlay: 0x1460e920> 
2015-08-28 19:07:29.394 soulbeats[13709:3307] Value of Groupinfo: <GroupInfo: 0x1589aad0> 
2015-08-28 19:07:29.400 soulbeats[13709:3307] HandleGrouping: added new member with id 7782687177520836128 temp group with ip 239.11.11.12 
+0

我看不出這個代碼有什麼問題,這導致我相信你有兩個*實例*的類實現'handleGroupingFromReceivedSpeakerInfo'。 –

+0

你可以添加'NSLog(@「%@」,self);'來檢查該方法嗎? –

+0

您是否創建了一個實例並將其設置爲「_IP_GroupInfo_Map」? – Wain

回答

1

事實證明你的程序多線程。用@synchronized環繞你的代碼,並獲得預期的輸出結果。

@synchronized使塊以原子方式執行。而在兩個線程可以輸入你的代碼之前,都發現你的字典是零,並且都實例化它,現在兩個(或更多)線程在同步塊的頂部等待,直到其他(s)退出。

但是,不要只是接受「它現在有效」,而應該嘗試找出爲什麼多線程時,你不認爲它!


(這個問題的部分中進行了chat討論)。

+0

是的,謝謝,我會找出原因。:) –

0

添加以下行

_IP_GroupInfo_Map = [NSMutableDictionary dictionary]; 
+0

謝謝你的回答,但是類擴展NSObject –

+0

仍然沒有工作:( –