菜鸟教程小白 发表于 2022-12-12 11:50:34

ios - NSNotificationCenter RemoveObserver 并不总是工作


                                            <p><p>通常我在 <code>viewWillAppear</code> 中添加我的观察者并在 <code>viewWillDisappear</code> 中删除它们。在这种情况下,即使在 View 消失后,我也需要其中一位观察者继续,以便它可以完成一些工作。为了确保观察者只在这个 View 中添加一次,我做了以下操作:</p>

<pre><code>-(void)viewWillAppear:(BOOL)animated
{
    ;

    [removeObserver:self
                                                   name:@&#34;imageSaved&#34;
                                                 object:nil];

    [addObserver:self
                                          selector:@selector(postMessageWithImage:)
                                                name:@&#34;imageSaved&#34;
                                              object:nil];


}
</code></pre>

<p>我已经对应用程序的其余部分进行了搜索,以确保该观察者未在其他任何地方注册。不幸的是,有时,但并非所有时候,并且没有一致的因素,通知会被触发两次。我还通过断点和 NSLog 确保不会多次调用 <code>postNotifcationName</code>。我无法在 iPhone 上重现,因为问题似乎仅限于 iPad。</p>

<p>在进一步的故障排除中,我检查了该方法是否是从同一个线程调用的(没有理由不会,只是为了检查)。如果我将 <code>removeObserver</code> 放在 <code>viewWillDisappear</code> 中,这个问题就会消失,但是,这又不是我需要它工作的方式。</p>

<p>显然,这种情况的观察者被注册了两次,但我找不到原因。正如您从代码中看到的那样,任何时候注册此观察者时,它都会首先被删除。我唯一的另一个想法是 <code>self</code> 是否会“损坏”,从而 <code>removeObserver</code> 无法正常运行? </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>当 View 显示时添加你的观察者,当 View 消失时移除它。</p>

<p><strong>添加:</strong></p>

<pre><code>- (void)viewDidLoad
{
[addObserver:self
                                          selector:@selector(postMessageWithImage:)
                                                name:@&#34;imageSaved&#34;
                                              object:nil];
}
</code></pre>

<p><strong>删除:</strong></p>

<pre><code>- (void)postMessageWithImage:(NSNotification*)aNotification
{
[removeObserver:self
                                                   name:@&#34;imageSaved&#34;
                                                 object:nil];
// here do your job
}
</code></pre>

<p>这是完全有效和高效的。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - NSNotificationCenter RemoveObserver 并不总是工作,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/25883013/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/25883013/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - NSNotificationCenter RemoveObserver 并不总是工作