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

时间:2015-03-18 10:04:20

标签: ios objective-c iphone opentok

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

我有两个视图控制器。

带有灰色图像的

A类(告诉用户离线)。

  • 它从B级调用setsession来建立会话。
  • 使用ClassADelegate并实现{A <1}},将A类灰色图像设置为绿色。

B类包含一个方法useronline。

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

流程是这样的。

  • 首先,A类从B类调用setupPublisher来建立会话。
  • 然后,当点击连接按钮时,调用setsession,然后调用viewdidload,视图被加载修改,并且所有这些。
  • 现在,当用户尝试连接setupPublisher时,系统会调用此命令。在这里,当我尝试打印session:streamCreated:值时,它会变为一个,同样许多其他变量也会变成type,这会导致仅提供音频和视频。

如果调用第一个nil(收到第一个视频,然后单击连接),则流程正常,session:streamCreated:中的print语句正确打印session:streamCreated:值为2。

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

1 个答案:

答案 0 :(得分:1)

您描述的流程并未遵循UIViewControllers应如何表现的任何已知模式。具体来说,您不应该使用视图控制器的单例实例。我认为您需要重新考虑架构,特别是这两个视图控制器之间的关系。

顺便说一下,只要viewDidLoad属性可用,就可以在视图控制器上调用view方法,该属性可以在屏幕上显示。如果视图控制器正在从故事板或笔尖加载其视图,则在该视图准备就绪后立即调用viewDidLoad。否则,如果您正在实施loadView,则在该方法完成后调用viewDidLoad

你能描述一下A级和B级试图完成的事吗?听起来A类是某种类型的状态视图的视图控制器,其显示用户的在线/离线状态。 B类听起来像是OTSessionDelegate以及发布者/订阅者视图所在的视图控制器。为什么这些视图控制器不一样? (通常,视图控制器用于控制内容的屏幕内容,除非您使用的是View Controller Containment)。如果这两个视图控制器不同时出现在屏幕上,那么转换发生时是否可以使用segue在它们之间传递数据?

<强>更新

附加信息对我提供推荐非常有用。我还不确定的是,如果你确实拥有这两个视图控制器&#39;同时在屏幕上观看。这个解决方案应该适用于这两种情况。

在segue之外,一个视图控制器不应该直接调用另一个视图控制器的方法(所以如你所述调用setsession是一个坏主意)。你甚至不应该把一个人当作另一个人的代表。他们最多应共享一个Model对象进行通信。 OTSession可以看作是Model对象。具有挑战性的限制是,在使用委托模式时,只能通知一个对象(您选择了B类)的更新。我认为您应该使用NSNotification s而不是使用委托模式。为了实现这一目标,你应该&#34;包装&#34;您自己的模型对象中的OTSession模型,将您自己的模型对象设置为委托。然后,您可以在控制器发生有趣变化时通知他们。我已经创建了一个图表来演示:

ios wrapped model that sends notifications

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