[objective-c]无法激活循环 (iPhone 应用程序) 中的任何其他元素

标签: ios Objective-C
发布时间: 2016/10/2 12:04:54
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我在我的 iPhone 应用程序上执行一个 UISwitch 按钮。打开开关时,电话应振动并播放声音。当开关处于关闭状态时,应停止振动和声音。当我打开开关时,我无法做任何事情,电话继续振动而发出的声音。我不能按任何其他按钮,可能因为 while 循环。这里是我的函数︰

- (IBAction)toggleVibrate:(id)sender {
    if([sender isOn]){
        //vibrate and play sound until toggled
        while(true) {
            AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

            SystemSoundID mySSID;

            NSString *path = [[NSBundle mainBundle] pathForResource:@"sound" ofType:@"wav"];
            AudioServicesCreateSystemSoundID((CFURLRef)CFBridgingRetain([NSURL fileURLWithPath: path]), &mySSID);

            AudioServicesPlaySystemSound(mySSID);
        };
    }else{
        //kill vibration and sound

    }
}

我如何能够杀死的振动和声音有什么想法?

解决方法 1:

你挡住主线程 (也称为 UI 线程)。你应该在一个单独的线程或队列运行该循环。这样试试︰

- (IBAction)toggleVibrate:(id)sender {
    static dispatch_queue_t my_queue = nil;

    if(my_queue == nil)
        my_queue = dispatch_queue_create("com.yourorg.vibrate_queue", NULL);

    if([sender isOn]){
        //vibrate and play sound until toggled
        dispatch_async(my_queue, ^{
            while([sender isOn]) {
                AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

                SystemSoundID mySSID;

                NSString *path = [[NSBundle mainBundle] pathForResource:@"sound" ofType:@"wav"];
                AudioServicesCreateSystemSoundID((CFURLRef)CFBridgingRetain([NSURL fileURLWithPath: path]), &mySSID);

                AudioServicesPlaySystemSound(mySSID);
            };
        });

    }
}
官方微信
官方QQ群
31647020