2015-08-28 73 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

仍然没有工作:( –