【问题标题】:KVO in iOS in multiple classes and its contextiOS中多个类的KVO及其上下文
【发布时间】:2015-10-29 12:53:35
【问题描述】:

您好,我使用 KVO 来观察 AvPlayer 状态,我在不同控制器中使用 AVPlayer 实例,并使用 KVO 观察它们。(前家庭控制器有播放器及其观察者,类别控制器有播放器及其观察者等)。 我有一个集中的常量类,我把观察比赛放在里面:

static void const *kCurrentItemDidChangeKVO  = &kCurrentItemDidChangeKVO;
static void const *kRateDidChangeKVO         = &kRateDidChangeKVO;
static void const *kStatusDidChangeKVO       = &kStatusDidChangeKVO;

在每个控制器中我添加如下观察者:

 if (player != nil)
    {
        [player addObserver:self forKeyPath:@"rate"                            options:NSKeyValueObservingOptionNew context:&kRateDidChangeKVO];
        [player addObserver:self forKeyPath:@"currentItem.status"              options:NSKeyValueObservingOptionNew context:&kStatusDidChangeKVO];
        [player addObserver:self forKeyPath:@"currentItem.duration"            options:NSKeyValueObservingOptionNew context:&kDurationDidChangeKVO];
    }

并删除每个控制器中的观察者,例如:

if (player != nil)
    {
            [player  removeObserver:self forKeyPath:@"rate" context:&kRateDidChangeKVO];
            [player  removeObserver:self forKeyPath:@"currentItem.status" context:&kStatusDidChangeKVO];
            [player  removeObserver:self forKeyPath:@"currentItem.duration" context:&kDurationDidChangeKVO];
    }

并且在每个AVPlayer 中,当使用来自常量文件的相同上下文查看、访问、viewWillAppeard 或 viewWillDissapeared 时,我添加和删除观察者。

我的问题是:可以为每个包含玩家观察者的类使用集中常量文件中的相同上下文,还是每个类都应该有自己的对该类唯一的上下文?

非常感谢任何帮助。 问候

【问题讨论】:

  • 最好的用途是创建一个全局 AVPlayer 及其 KVO 并在应用程序中使用,因为它可以在应用程序的后台和前台状态中轻松管理,而不是为每个视图创建一个新的 AVPlayer 及其 KVO控制器是不好的使用习惯。

标签: ios avplayer key-value-observing kvocontroller


【解决方案1】:

最佳使用:创建全局AVPlayer及其KVO并在应用程序中使用,因为它易于在应用程序的后台和前台状态进行管理,并且易于使用。

注意:一次只能播放一个声音/视频,因此即使不同视图控制器的声音/视频不同,也可以使用相同的全局 AVPlayer 来播放。

怎么做?

在不同的视图控制器中使用全局 AVPlayer 的实例,简单的规则是删除 AVPlayer 添加的视图,然后再在不同的视图控制器中再次添加它。

不好的使用习惯:为每个难以处理的视图控制器创建一个新的 AVPlayer 及其 KVO。

【讨论】:

  • 感谢您的信息,这是交易,我有一个基于选项卡的应用程序,如果我转到选项卡 3,AVPlayer 应该在第一个选项卡中播放视频,我必须尽快播放另一个视频控制器出现并暂停播放器控制器消失时的第一个选项卡,有可能以这种方式全局创建 AVPlayer 及其 KVO 吗?请让我知道,以便我可以接受您提供的解决方案。
  • 是的,它可以在不同的视图控制器中使用全局 AVPlayer 的实例,简单的规则是在再次添加它的不同视图控制器中使用之前删除添加的 AVPlayer 的视图。
  • 非常感谢,您有我可以参考的实际示例代码吗,那将非常有帮助。 :)
  • 不,我没有任何示例代码,但我在一个应用程序中完成了这项工作,它在后台播放视频,在应用程序的任何地方都可以找到当前正在播放的视频。
  • 我认为github.com/rFlex/SCRecorder/blob/master/Library/Sources/… SCPlayer 是一个很好的例子:),你不同意吗:)。接受你的正确答案。
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多