diff --git a/Riot/Modules/Room/Members/RoomParticipantsViewController.m b/Riot/Modules/Room/Members/RoomParticipantsViewController.m index f543fa449..1b2c4d23b 100644 --- a/Riot/Modules/Room/Members/RoomParticipantsViewController.m +++ b/Riot/Modules/Room/Members/RoomParticipantsViewController.m @@ -216,8 +216,13 @@ if (membersListener) { - [self.mxRoom.liveTimeline removeListener:membersListener]; - membersListener = nil; + MXWeakify(self); + [self.mxRoom liveTimeline:^(MXEventTimeline *liveTimeline) { + MXStrongifyAndReturnIfNil(self); + + [liveTimeline removeListener:self->membersListener]; + self->membersListener = nil; + }]; } if (currentAlert) @@ -330,7 +335,10 @@ { // Cancel any pending search [self searchBarCancelButtonClicked:_searchBarView]; - + + // @TODO(async-state): Need to expose [MXSession preloadRoomsData] to avoid race + // between _mxRoom & mxRoom + // Remove previous room registration (if any). if (_mxRoom) { @@ -347,8 +355,13 @@ } if (membersListener) { - [_mxRoom.liveTimeline removeListener:membersListener]; - membersListener = nil; + MXWeakify(self); + [self.mxRoom liveTimeline:^(MXEventTimeline *liveTimeline) { + MXStrongifyAndReturnIfNil(self); + + [liveTimeline removeListener:self->membersListener]; + self->membersListener = nil; + }]; } [self removeMatrixSession:_mxRoom.mxSession]; @@ -394,66 +407,71 @@ // Register a listener for events that concern room members NSArray *mxMembersEvents = @[kMXEventTypeStringRoomMember, kMXEventTypeStringRoomThirdPartyInvite, kMXEventTypeStringRoomPowerLevels]; - membersListener = [_mxRoom.liveTimeline listenToEventsOfTypes:mxMembersEvents onEvent:^(MXEvent *event, MXTimelineDirection direction, id customObject) { - - // Consider only live event - if (direction == MXTimelineDirectionForwards) - { - switch (event.eventType) + + MXWeakify(self); + [self.mxRoom liveTimeline:^(MXEventTimeline *liveTimeline) { + MXStrongifyAndReturnIfNil(self); + + self->membersListener = [liveTimeline listenToEventsOfTypes:mxMembersEvents onEvent:^(MXEvent *event, MXTimelineDirection direction, id customObject) { + + // Consider only live event + if (direction == MXTimelineDirectionForwards) { - case MXEventTypeRoomMember: + switch (event.eventType) { - // Take into account updated member - // Ignore here change related to the current user (this change is handled by leaveRoomNotificationObserver) - if ([event.stateKey isEqualToString:self.mxRoom.mxSession.myUser.userId] == NO) + case MXEventTypeRoomMember: { - MXRoomMember *mxMember = [self.mxRoom.state.members memberWithUserId:event.stateKey]; - if (mxMember) + // Take into account updated member + // Ignore here change related to the current user (this change is handled by leaveRoomNotificationObserver) + if ([event.stateKey isEqualToString:self.mxRoom.mxSession.myUser.userId] == NO) { - // Remove previous occurrence of this member (if any) - [self removeParticipantByKey:mxMember.userId]; - - // If any, remove 3pid invite corresponding to this room member - if (mxMember.thirdPartyInviteToken) + MXRoomMember *mxMember = [self.mxRoom.state.members memberWithUserId:event.stateKey]; + if (mxMember) { - [self removeParticipantByKey:mxMember.thirdPartyInviteToken]; + // Remove previous occurrence of this member (if any) + [self removeParticipantByKey:mxMember.userId]; + + // If any, remove 3pid invite corresponding to this room member + if (mxMember.thirdPartyInviteToken) + { + [self removeParticipantByKey:mxMember.thirdPartyInviteToken]; + } + + [self handleRoomMember:mxMember]; + + [self finalizeParticipantsList]; + + [self refreshTableView]; } - - [self handleRoomMember:mxMember]; - + } + + break; + } + case MXEventTypeRoomThirdPartyInvite: + { + MXRoomThirdPartyInvite *thirdPartyInvite = [self.mxRoom.state thirdPartyInviteWithToken:event.stateKey]; + if (thirdPartyInvite) + { + [self addRoomThirdPartyInviteToParticipants:thirdPartyInvite]; + [self finalizeParticipantsList]; - + [self refreshTableView]; } + break; } - - break; - } - case MXEventTypeRoomThirdPartyInvite: - { - MXRoomThirdPartyInvite *thirdPartyInvite = [self.mxRoom.state thirdPartyInviteWithToken:event.stateKey]; - if (thirdPartyInvite) + case MXEventTypeRoomPowerLevels: { - [self addRoomThirdPartyInviteToParticipants:thirdPartyInvite]; - - [self finalizeParticipantsList]; - + [self refreshParticipantsFromRoomMembers]; + [self refreshTableView]; + break; } - break; + default: + break; } - case MXEventTypeRoomPowerLevels: - { - [self refreshParticipantsFromRoomMembers]; - - [self refreshTableView]; - break; - } - default: - break; } - } - + }]; }]; } else diff --git a/Riot/Modules/Room/RoomViewController.m b/Riot/Modules/Room/RoomViewController.m index 5f7e72ec0..bf7067533 100644 --- a/Riot/Modules/Room/RoomViewController.m +++ b/Riot/Modules/Room/RoomViewController.m @@ -3555,8 +3555,13 @@ // Remove the previous live listener if (typingNotifListener) { - [self.roomDataSource.room.liveTimeline removeListener:typingNotifListener]; - typingNotifListener = nil; + MXWeakify(self); + [self.roomDataSource.room liveTimeline:^(MXEventTimeline *liveTimeline) { + MXStrongifyAndReturnIfNil(self); + + [liveTimeline removeListener:self->typingNotifListener]; + self->typingNotifListener = nil; + }]; } } @@ -3568,28 +3573,32 @@ if (self.roomDataSource) { // Add typing notification listener - typingNotifListener = [self.roomDataSource.room.liveTimeline listenToEventsOfTypes:@[kMXEventTypeStringTypingNotification] onEvent:^(MXEvent *event, MXTimelineDirection direction, MXRoomState *roomState) { - - // Handle only live events - if (direction == MXTimelineDirectionForwards) - { - // Retrieve typing users list - NSMutableArray *typingUsers = [NSMutableArray arrayWithArray:self.roomDataSource.room.typingUsers]; - // Remove typing info for the current user - NSUInteger index = [typingUsers indexOfObject:self.mainSession.myUser.userId]; - if (index != NSNotFound) + MXWeakify(self); + [self.roomDataSource.room liveTimeline:^(MXEventTimeline *liveTimeline) { + MXStrongifyAndReturnIfNil(self); + + self->typingNotifListener = [liveTimeline listenToEventsOfTypes:@[kMXEventTypeStringTypingNotification] onEvent:^(MXEvent *event, MXTimelineDirection direction, MXRoomState *roomState) { + + // Handle only live events + if (direction == MXTimelineDirectionForwards) { - [typingUsers removeObjectAtIndex:index]; + // Retrieve typing users list + NSMutableArray *typingUsers = [NSMutableArray arrayWithArray:self.roomDataSource.room.typingUsers]; + // Remove typing info for the current user + NSUInteger index = [typingUsers indexOfObject:self.mainSession.myUser.userId]; + if (index != NSNotFound) + { + [typingUsers removeObjectAtIndex:index]; + } + + // Ignore this notification if both arrays are empty + if (currentTypingUsers.count || typingUsers.count) + { + currentTypingUsers = typingUsers; + [self refreshActivitiesViewDisplay]; + } } - - // Ignore this notification if both arrays are empty - if (currentTypingUsers.count || typingUsers.count) - { - currentTypingUsers = typingUsers; - [self refreshActivitiesViewDisplay]; - } - } - + }]; }]; // Retrieve the current typing users list diff --git a/Riot/Modules/Room/Settings/RoomSettingsViewController.m b/Riot/Modules/Room/Settings/RoomSettingsViewController.m index 4355bf9b4..0d05a9664 100644 --- a/Riot/Modules/Room/Settings/RoomSettingsViewController.m +++ b/Riot/Modules/Room/Settings/RoomSettingsViewController.m @@ -190,12 +190,17 @@ NSString *const kRoomSettingsAdvancedE2eEnabledCellViewIdentifier = @"kRoomSetti [super initWithSession:session andRoomId:roomId]; // Add an additional listener to update banned users - extraEventsListener = [mxRoom.liveTimeline listenToEventsOfTypes:@[kMXEventTypeStringRoomMember] onEvent:^(MXEvent *event, MXTimelineDirection direction, MXRoomState *roomState) { - - if (direction == MXTimelineDirectionForwards) - { - [self updateRoomState:roomState]; - } + MXWeakify(self); + [mxRoom liveTimeline:^(MXEventTimeline *liveTimeline) { + MXStrongifyAndReturnIfNil(self); + + self->extraEventsListener = [liveTimeline listenToEventsOfTypes:@[kMXEventTypeStringRoomMember] onEvent:^(MXEvent *event, MXTimelineDirection direction, MXRoomState *roomState) { + + if (direction == MXTimelineDirectionForwards) + { + [self updateRoomState:roomState]; + } + }]; }]; } @@ -399,8 +404,13 @@ NSString *const kRoomSettingsAdvancedE2eEnabledCellViewIdentifier = @"kRoomSetti if (extraEventsListener) { - [mxRoom.liveTimeline removeListener:extraEventsListener]; - extraEventsListener = nil; + MXWeakify(self); + [mxRoom liveTimeline:^(MXEventTimeline *liveTimeline) { + MXStrongifyAndReturnIfNil(self); + + [liveTimeline removeListener:self->extraEventsListener]; + self->extraEventsListener = nil; + }]; } [super destroy];