FBSimulatorControl/Strategies/FBSimulatorNotificationUpdateStrategy.m (59 lines of code) (raw):

/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #import "FBSimulatorNotificationUpdateStrategy.h" #import <CoreSimulator/SimDevice.h> #import <FBControlCore/FBControlCore.h> #import "FBCoreSimulatorNotifier.h" #import "FBSimulator.h" #import "FBSimulatorSet.h" #import "FBSimulator+Private.h" @interface FBSimulatorNotificationUpdateStrategy () @property (nonatomic, weak, readonly) FBSimulatorSet *set; @property (nonatomic, strong, readwrite) FBCoreSimulatorNotifier *notifier; @end @implementation FBSimulatorNotificationUpdateStrategy #pragma mark Initializers + (instancetype)strategyWithSet:(FBSimulatorSet *)set { FBSimulatorNotificationUpdateStrategy *strategy = [[self alloc] initWithSet:set]; [strategy startNotifyingOfStateChanges]; return strategy; } - (instancetype)initWithSet:(FBSimulatorSet *)set { self = [super init]; if (!self) { return nil; } _set = set; return self; } - (void)dealloc { [self.notifier terminate]; self.notifier = nil; } #pragma mark Private - (void)startNotifyingOfStateChanges { __weak typeof(self) weakSelf = self; self.notifier = [FBCoreSimulatorNotifier notifierForSet:self.set queue:self.set.workQueue block:^(NSDictionary *info) { SimDevice *device = info[@"device"]; if (!device) { return; } NSNumber *newStateNumber = info[@"new_state"]; if (!newStateNumber) { return; } [weakSelf device:device didChangeState:newStateNumber.unsignedIntegerValue]; }]; } - (void)device:(SimDevice *)device didChangeState:(FBiOSTargetState)state { FBSimulator *simulator = [self.set simulatorWithUDID:device.UDID.UUIDString]; if (!simulator) { return; } [simulator disconnectWithTimeout:FBControlCoreGlobalConfiguration.regularTimeout logger:simulator.logger]; [_set.delegate targetUpdated:simulator inTargetSet:simulator.set]; } @end