ios - 如果首先在 OPENTOK 中创建流,则无法获取视频

标签 ios objective-c iphone opentok

我基本上是在尝试使用 opentok 实现视频 session 功能。

我有两个 View Controller 。

A 级,具有灰色图像(告诉用户离线)。

  • 它从类 B 调用 setsession 来建立 session 。
  • 使用 ClassADelegate 并实现将 A 类灰色图像设置为绿色的 setUserOnlineImage

B类拥有一个方法useronline。

  • 有一个类方法sharedinstance,它给出类的单例实例
  • viewdidload ->设置变量type = 2;
  • setsession ->设置变量type = 1;
  • 它还有一个协议(protocol)“ClassADelegate”
  • 协议(protocol) ClassADelegate 具有方法 setUserOnlineImage
  • 有一个回调方法 session:streamCreated: 会在创建订阅者时调用,而 setupPublisher 会发布视频

流程是这样的。

  • 首先,A 类调用 B 类的setsession来建立 session 。
  • 然后,当单击连接按钮时,调用 viewdidload,然后调用 setupPublisher,修改加载的 View 等等。
  • 现在,当订阅者尝试连接时,会调用 session:streamCreated:。在这里,当我尝试打印 type 值时,它作为一个值出现,同样,许多其他变量也变成了 nil,这反过来导致只提供音频而看不到视频。<

如果首先调用 session:streamCreated:(接收到第一个视频,然后单击连接),流程工作正常并且 session:streamCreated: 中的打印语句> 正确地将 type 值打印为 2。

有人帮我弄清楚发生了什么事。 我想知道为什么 type 值发生变化并且各种其他变量变为 nil。这会阻止视频显示。我错过了什么吗?是否已采用任何其他实例(但我使用的是单例实例)?

最佳答案

您描述的流程不遵循任何已知的 UIViewController 行为模式。具体来说,您不需要使用 View Controller 的单例实例。我认为您需要重新考虑架构,特别是这两个 View Controller 之间的关系。

顺便说一句,一旦 View Controller 的 view 属性变得可用,就会在 View Controller 上调用 viewDidLoad 方法,该属性可以在其出现在屏幕上之前。如果 View Controller 从 Storyboard或 Nib 加载其 View ,则一旦该 View 准备好,就会调用viewDidLoad。否则,如果您正在实现 loadView,则在该方法完成后将调用 viewDidLoad

你能描述一下A类和B类想要实现的目标吗?听起来 A 类是某种类型的状态 View 的 View Controller ,用于显示用户的在线/离线状态。 B 类听起来像是 OTSessionDelegate 以及用于放置发布者/订阅者 View 的 View Controller 。为什么这些不是同一个 View Controller ? (通常 View Controller 旨在控制“满屏幕”的内容,除非您使用 View Controller 包含)。如果这两个 View Controller 不同时出现在屏幕上,当转换发生时,您可以使用segue在它们之间传递数据吗?

更新:

附加信息对我给您推荐很有用。我仍然不确定的是,您是否确实同时在屏幕上显示了这 2 个 View Controller 的 View 。此解决方案应该适用于这两种情况。

在segue之外,一个 View Controller 实际上不应该直接调用另一个 View Controller 的方法(因此按照您的描述调用setsession是一个坏主意)。您甚至不应该将一个设置为另一个的代表。他们至多应该共享一个模型对象来进行通信。 OTSession 可以看作是一个模型对象。具有挑战性的限制是当使用委托(delegate)模式时,只有一个对象(你选择了 B 类)可以被通知更新。我认为您应该使用 NSNotification 而不是使用委托(delegate)模式。为了实现这一点,您应该将 OTSession 模型“包装”在您自己的模型对象中,将您自己的模型对象设置为委托(delegate)。然后您可以在有趣的变化发生时通知两个 Controller 。我创建了一个图表来演示:

ios wrapped model that sends notifications

在此图中,所有向下的实线箭头都是拥有引用。 VideoConference 将是您自己的类,它将实现 OTSessionDelegateProtocol。在初始化时,VideoConference 实例将创建并拥有一个 OTSession 实例。当 A 类或 B 类需要了解的事情发生时(例如远程用户上线),VideoConference 可以发送 NSNotification,两个 Controller 都可以是观察者。这是一个 useful article about NSNotifications .

关于ios - 如果首先在 OPENTOK 中创建流,则无法获取视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29119084/

相关文章:

ios - 如何使用 NS_RETURNS_INNER_POINTER 标志

iphone - 如何在保持 UI 响应的同时以可接受的性能录制屏幕?

iphone - NSManagedObject 临时使用,如何在 NSObject 和 NSManagedObject 之间切换

ios - 编辑期间移动到另一个 View 时 UITextView 问题

ios - 平移速度计算以快速执行不同的任务

ios - 适合开放式键盘 Swift

ios - 在动画期间观察 UIView 框架的变化

objective-c - 如何将关联对象添加到点击手势?

objective-c - NSTableView 上的圆角

iphone - 您是否有任何理由不想在每次构建 iOS 应用程序时都使用静态分析器?