菜鸟教程小白 发表于 2022-12-12 08:53:33

ios - iOS中等待用户交互的设计模式?


                                            <p><p>我正在开发一款适用于 iOS 的 BlackJack 游戏。跟踪当前状态和需要做什么变得越来越困难。例如,我有一个跟踪当前游戏的 C++ 类:</p>

<pre><code>class Game {
queue&lt;Player&gt; playerQueue;
void hit();
void stand();
}
</code></pre>

<p>目前我正在使用事件(方法 A)来实现它:</p>

<pre><code>- (void)hitButtonPress:(id)sender {
game-&gt;hit();
}

void Game::hit() {
dealCard(playerQueue.top());
}

void Game::stand() {
playerQueue.pop();
goToNextPlayersTurn();
}
</code></pre>

<p>随着越来越多的选项被添加到游戏中,为每个选项创建事件变得乏味且难以跟踪。</p>

<p>我想到的另一种实现方式是这样的(方法B):</p>

<pre><code>void Game::playersTurn(Player *player) {
dealCards(player);
while (true) {
    string choice = waitForUserChoice();
    if (choice == &#34;stand&#34;) break;
    if (choice == &#34;hit&#34;)
      dealCard(player);
    // etc.
}
playerQueue.pop();
goToNextPlayersTurn();
}
</code></pre>

<p>其中 <code>waitForUserChoice</code> 是一个特殊函数,它允许用户与 <code>UIViewController</code> 进行交互,并且一旦用户按下按钮,然后才将控制权返回给 <code>playersTurn </code> 函数。换句话说,它会暂停程序,直到用户单击按钮。</p>

<p>使用方法 A,我需要在每次需要用户交互时拆分我的功能。方法 B 让一切都更加可控。
本质上方法A和B的区别如下:</p>

<p>答:</p>

<pre><code>function A() {
initialize();
// now wait for user interaction by waiting for a call to CompleteA
}

function CompleteA() {
finalize();
}
</code></pre>

<p>乙:</p>

<pre><code>function B() {
initialize();
waitForUserInteraction();
finalize();
}
</code></pre>

<p>注意 B 如何使代码更有条理。有没有办法用 Objective-C 做到这一点?或者有没有我没有提到推荐的不同方法?</p>

<p>我能想到的第三种选择是使用有限状态机。我听说过一些关于他们的事情,但我确定这在这种情况下是否对我有帮助。</p>

<p>针对我的问题推荐的设计模式是什么?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我了解您遇到的困境。当我第一次开始使用 iOS 时,我很难考虑放弃对操作系统的控制权。</p>

<p>一般而言,iOS 会鼓励您使用方法 A。通常您的 ViewController 中有变量在方法 A() 中设置,然后在 CompleteA() 中检查它们以验证 A() 是否首先运行等。 </p>

<p>关于您关于有限状态机的问题,我认为它可以帮助您解决问题。我在 iOS 中写的第一件事是 FSM(这是非常糟糕的代码)但是你可以看一下这里(在 FlipsideViewController.m 的底部附近:</p>

<p> <a href="https://github.com/esromneb/ios-finite-state-machine" rel="noreferrer noopener nofollow">https://github.com/esromneb/ios-finite-state-machine</a> </p>

<p>一般的想法是你把它放在你的 .h 文件中的 @interfaceblock 内</p>

<pre><code>static int state = 0;
static int running = 0;
</code></pre>

<p>在你的 .m 中你有这个:</p>

<pre><code>- (void) tick {

    switch (state) {
      case 0:
            //this case only runs once for the fsm, so setup one time initializations

            // next state
            state = 1;

            break;
      case 1:
            navBarStatus.topItem.title = @&#34;Connecting...&#34;;
            state = 2;
            break;
      case 2:
            // if something happend we move on, if not we wait in the connecting stage
            if( something )
                state = 3;
            else
                state = 1;
            break;
      case 3:
            // respond to something

            // next state
            state = 4;
            break;
      case 4:
            // wait for user interaction
            navBarStatus.topItem.title = @&#34;Press a button!&#34;;
            state = 4;

            globalCommand = userInput;

            // if user did something
            if( globalCommand != 0 )
            {
                // go to state to consume user interaction
                state = 5;
            }

            break;

      case 5:
            if( globalCommand == 6 )
            {
                // respond to command #6
            }
            if( globalCommand == 7 )
            {
                // respond to command #7
                }

                        // go back and wait for user input
                        state = 4;
            break;

      default:
            state = 0;
            break;
    }

    if( running )
    {
      ;
    }
}
</code></pre>

<p>在此示例中(根据 github 上的示例修改)globalCommand 是一个表示用户输入的 int。如果 globalCommand 为 0,则 FSM 将在状态 4 中旋转,直到 globalCommand 不为零。</p>

<p>要启动 FSM,只需将 running 设置为 1 并从 viewController 调用 。 FSM 将每 0.1 秒“滴答”一次,直到运行设置为 0。</p>

<p>在我最初的 FSM 设计中,我必须响应来自运行它自己的软件的 Windows 计算机的用户输入和网络输入。在我的设计中,Windows PC 也运行着类似但不同的 FSM。对于这个设计,我使用 NSMutuableArray 构建了两个 FIFO 队列对象的命令。用户交互和网络数据包会将命令排入队列,而 FSM 会将项目出列并响应它们。我最终使用了 <a href="https://github.com/esromneb/ios-queue-object" rel="noreferrer noopener nofollow">https://github.com/esromneb/ios-queue-object</a>排队。</p>

<p>如果您需要任何澄清,请发表评论。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - iOS中等待用户交互的设计模式?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/14995611/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/14995611/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - iOS中等待用户交互的设计模式?