Fix a crash when apps are removed from GFE

This commit is contained in:
Cameron Gutman
2015-09-30 20:44:14 -07:00
parent b6445295a7
commit 05a5e4fa64
@@ -146,6 +146,7 @@ static NSMutableSet* hostList;
BOOL appAlreadyInList = NO; BOOL appAlreadyInList = NO;
for (App* savedApp in host.appList) { for (App* savedApp in host.appList) {
if ([app.id isEqualToString:savedApp.id]) { if ([app.id isEqualToString:savedApp.id]) {
savedApp.name = app.name;
savedApp.isRunning = app.isRunning; savedApp.isRunning = app.isRunning;
appAlreadyInList = YES; appAlreadyInList = YES;
break; break;
@@ -157,8 +158,12 @@ static NSMutableSet* hostList;
} }
} }
BOOL appWasRemoved;
do {
appWasRemoved = NO;
for (App* app in host.appList) { for (App* app in host.appList) {
BOOL appWasRemoved = YES; appWasRemoved = YES;
for (App* mergedApp in newList) { for (App* mergedApp in newList) {
if ([mergedApp.id isEqualToString:app.id]) { if ([mergedApp.id isEqualToString:app.id]) {
appWasRemoved = NO; appWasRemoved = NO;
@@ -166,9 +171,16 @@ static NSMutableSet* hostList;
} }
} }
if (appWasRemoved) { if (appWasRemoved) {
// Removing the app mutates the list we're iterating (which isn't legal).
// We need to jump out of this loop and restart enumeration.
[database removeAppFromHost:app]; [database removeAppFromHost:app];
break;
} }
} }
// Keep looping until the list is no longer being mutated
} while (appWasRemoved);
[database saveData]; [database saveData];
} }