2

指定されたアイドル時間に基づいてオブジェクトを無効にする最良の方法を理解しようとしています。以下の 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;
    }
}
4

1 に答える 1

0

デリゲート パターンを使用できます。

1) プロトコルJoystickDelegateを作成し、メソッドを宣言し- (void)joystickInvalidated:(Joystick *)joystickます。

2)JoystickControllerを実装する必要がありますJoystickDelegatejoystick配列から削除するメソッドを実装します。

3) 最後delegateに、JoystickインターフェイスとJoystickin joystickAddedassign selfonのすべての初期化で呼び出される弱いプロパティを作成しますjs.delegate

4) が呼び出されるたびに、 with insideinvalidateを呼び出すだけです:delegateselfJoystick

[self.delegate joystickInvalidated:self];
于 2013-07-05T20:39:01.243 に答える