菜鸟教程小白 发表于 2022-12-13 09:14:56

ios - 在 IOS 中遍历 NSDictionary 和计时事件


                                            <p><p>我是 IOS/Objective C 的新手,我正在尝试找出创建集合、迭代它以及为事件计时的最佳方法。 </p>

<p>我有一首歌曲的一系列歌词,当音乐在歌曲的正确位置播放时,我希望一首歌曲的单独一行出现在屏幕上。因此,我开始执行以下操作:我将各个行放入 Dictionary 以及该行应该出现的毫秒值。 </p>

<pre><code>   NSDictionary *bualadhBos = [NSDictionary dictionaryWithObjectsAndKeys:
                           , @&#34;Muid uilig ag bualadh bos, &#34;,
                           , @&#34;Muid uilig ag tógáil cos, &#34;,
                           , @&#34;Muid ag déanamh fead ghlaice, &#34;,
                           , @&#34;Muid uilig ag geaibíneacht. &#34;,
                           , @&#34;Buail do ghlúine 1, 2, 3, &#34;,
                           , @&#34;Buail do bholg mór buí, &#34;,
                           , @&#34;Léim suas, ansin suigh síos, &#34;,
                           , @&#34;Seasaigh suas go hard arís. &#34;,
                           , @&#34;Sín amach do dhá lamh, &#34;,
                           , @&#34;Anois lig ort go bhfuil tú &#39; snámh. &#34;,
                           , @&#34;Amharc ar dheis, ansin ar chlé, &#34;,
                           , @&#34;Tóg do shúile go dtí an spéir. &#34;,
                           , @&#34;Tiontaigh thart is thart arís, &#34;,
                           , @&#34;Cuir síos do dhá lámh le do thaobh, &#34;,
                           , @&#34;Lámha suas is lúb do ghlúin, &#34;,
                           , @&#34;Suigí síos anois go ciúin. &#34;, nil
                           ];
</code></pre>

<p>然后我想遍历字典,创建一个 Timer,它会调用一个负责更改 textLayer 中文本的方法</p>

<pre><code>for (id key in bualadhBos ) {
    NSTimer *timer;
    timer = [ target:self selector:@selector(changeText) userInfo:nil repeats:NO]];

}

-(void)changeText {
    // change the text of the textLayer
    textLayer.string = @&#34;Some New Text&#34;;
}
</code></pre>

<p>但是当我开始调试它并检查它是如何工作的时,我注意到在调试器中项目出现在字典中的顺序都被打乱了。我还担心(我对此知之甚少)我正在创建多个计时器,并且可能有更有效的方法来解决这个问题。</p>

<p>任何方向将不胜感激。 </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>字典以最适合哈希算法的方式按定义排序,因此您永远不应依赖它们的顺序。</p>

<p>在您的情况下,最好构建一棵二叉树并拥有一个每秒触发一次的 NSTimer,执行二叉树搜索并返回提供的时间偏移量最接近的字符串。</p>

<p>如果您使用 AVFoundation 或 AVPlayer 进行播放。然后要将字幕与媒体播放同步,您可以使用 <code>addPeriodicTimeObserverForInterval</code> 之类的东西每秒触发一次计时器并在二叉树中执行搜索并更新 UI。</p>

<p>在伪代码中:</p>

<pre><code>[player addPeriodicTimeObserverForInterval:CMTimeMake(1, 1) queue:NULL usingBlock:^(CMTime time) {
    // get playback time
    NSTimeInterval seconds = CMTimeGetSeconds(time);

    // search b-tree
    NSString* subtitle = MyBtreeFindSubtitleForTimeInterval(seconds);

    // update UI
    myTextLabel.text = subtitle;
}];
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在 IOS 中遍历 NSDictionary 和计时事件,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/25996838/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/25996838/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在 IOS 中遍历 NSDictionary 和计时事件