Skip to content

Commit

Permalink
Modify Import Pool menu on main thread
Browse files Browse the repository at this point in the history
Avoid potential crashes due to race conditions by only trying to change
menu contents from the main thread.
  • Loading branch information
cbreak-black committed Jun 16, 2019
1 parent 01dd015 commit 3dacf2e
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 14 deletions.
1 change: 1 addition & 0 deletions ZetaWatch/Base.lproj/MainMenu.xib
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
<customObject id="geo-tu-CMM" userLabel="ZetaImportMenuDelegate" customClass="ZetaImportMenuDelegate">
<connections>
<outlet property="_authorization" destination="GUh-uV-dxo" id="Psx-ls-DeC"/>
<outlet property="importMenu" destination="fE9-G4-NH4" id="jfo-ja-1Zj"/>
</connections>
</customObject>
<customObject id="R7D-cp-kuE" userLabel="ZetaKeyLoaderDelegate" customClass="ZetaKeyLoaderDelegate">
Expand Down
2 changes: 2 additions & 0 deletions ZetaWatch/ZetaImportMenuDelegate.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

@interface ZetaImportMenuDelegate : ZetaBaseDelegate <NSMenuDelegate>

@property (weak) IBOutlet NSMenu * importMenu;

@end

#endif /* ZetaImportMenuDelegate_h */
49 changes: 35 additions & 14 deletions ZetaWatch/ZetaImportMenuDelegate.mm
Original file line number Diff line number Diff line change
Expand Up @@ -18,28 +18,49 @@ - (void)menuNeedsUpdate:(NSMenu*)menu
[menu addItemWithTitle:@"Searching for importable Pools..." action:NULL keyEquivalent:@""];
[_authorization importablePoolsWithReply:^(NSError * error, NSDictionary * importablePools)
{
if ([importablePools count] > 0)
if (error)
{
NSMenuItem * item = [menu itemAtIndex:0];
[item setTitle:[NSString stringWithFormat:
@"%lu importable Pools found", [importablePools count]]];
for (NSString * name in importablePools)
{
NSMenuItem * item = [menu addItemWithTitle:name action:@selector(importPool:) keyEquivalent:@""];
[item setTitle:[NSString stringWithFormat:@"%@ (%llu)", name, [importablePools[name] unsignedLongLongValue]]];
[item setAction:@selector(importPool:)];
[item setTarget:self];
[item setRepresentedObject:importablePools[name]];
}
[self performSelectorOnMainThread:@selector(importablePoolsError:)
withObject:error waitUntilDone:NO];
}
else
{
NSMenuItem * item = [menu itemAtIndex:0];
[item setTitle:@"No importable Pools found"];
[self performSelectorOnMainThread:@selector(importablePoolsDiscovered:)
withObject:importablePools waitUntilDone:NO];
}

}];
}

- (void)importablePoolsDiscovered:(NSDictionary*)importablePools
{
if ([importablePools count] > 0)
{
NSMenuItem * item = [_importMenu itemAtIndex:0];
[item setTitle:[NSString stringWithFormat:
@"%lu importable Pools found", [importablePools count]]];
for (NSString * name in importablePools)
{
NSMenuItem * item = [_importMenu addItemWithTitle:name action:@selector(importPool:) keyEquivalent:@""];
[item setTitle:[NSString stringWithFormat:@"%@ (%llu)", name, [importablePools[name] unsignedLongLongValue]]];
[item setAction:@selector(importPool:)];
[item setTarget:self];
[item setRepresentedObject:importablePools[name]];
}
}
else
{
NSMenuItem * item = [_importMenu itemAtIndex:0];
[item setTitle:@"No importable Pools found"];
}
}

- (void)importablePoolsError:(NSError*)error
{
NSMenuItem * item = [_importMenu itemAtIndex:0];
[item setTitle:[error localizedDescription]];
}

- (IBAction)importPool:(id)sender
{
NSDictionary * pools = @{ @"poolGUID": [sender representedObject] };
Expand Down

0 comments on commit 3dacf2e

Please sign in to comment.