指定されたアイドル時間に基づいてオブジェクトを無効にする最良の方法を理解しようとしています。以下の joystickAdded メソッドからインスタンス化されると、そのインスタンスの NSTimer を自動的に起動するジョイスティック オブジェクトがあります。
ジョイスティック
idleTimer = [NSTimer scheduledTimerWithTimeInterval:300 target:self selector:@selector(invalidate) userInfo:nil repeats:YES];
これは正常に動作しますが、アイドル時に呼び出されるメソッドが joystickRemoved であるため、私のジョイスティック配列はクリーンアップされませんが、これを呼び出す方法や、NSTimer がこれに最適な方法であるかどうかはわかりません。
ジョイスティックコントローラー
void joystickAdded(void *inContext, IOReturn inResult, void *inSender, IOHIDDeviceRef device) {
JoystickController *self = (__bridge JoystickController*)inContext;
IOHIDDeviceOpen(device, kIOHIDOptionsTypeNone);
// Filter events for joystickAction
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject:[NSNumber numberWithInt:kIOHIDElementTypeInput_Button] forKey:(NSString*)CFSTR(kIOHIDElementTypeKey)];
IOHIDDeviceSetInputValueMatching(device, (__bridge CFDictionaryRef)(dict));
// Register callback for action event to find the joystick easier
IOHIDDeviceRegisterInputValueCallback(device, joystickAction, (__bridge void*)self);
Joystick *js = [[Joystick alloc] initWithDevice:device];
[[self joysticks] addObject:js];
}
void joystickRemoved(void *inContext, IOReturn inResult, void *inSender, IOHIDDeviceRef device) {
// Find joystick
JoystickController *self = (__bridge JoystickController*)inContext;
Joystick *js = [self findJoystickByRef:device];
if(!js) {
NSLog(@"Warning: No joysticks to remove");
return;
}
[[self joysticks] removeObject:js];
[js invalidate];
}
void joystickAction(void *inContext, IOReturn inResult, void *inSender, IOHIDValueRef value) {
long buttonState;
// Find joystick
JoystickController *self = (__bridge JoystickController*)inContext;
IOHIDDeviceRef device = IOHIDQueueGetDevice((IOHIDQueueRef) inSender);
Joystick *js = [self findJoystickByRef:device];
// Get button state
buttonState = IOHIDValueGetIntegerValue(value);
switch (buttonState) {
// Button pressed
case 1: {
// Reset joystick idle timer
[[js idleTimer] setFireDate:[NSDate dateWithTimeIntervalSinceNow:300]];
break;
}
// Button released
case 0:
break;
}
}