我基本上是尝试使用opentok实现视频会议功能。
我有两个视图控制器。
带有灰色图像的A类(告诉用户离线)。
B类包含一个方法useronline。
setUserOnlineImage
,它给出了类sharedinstance
type = 2;
type = 1;
。setUserOnlineImage
以及发布视频的session:streamCreated:
流程是这样的。
setupPublisher
来建立会话。setsession
,然后调用viewdidload
,视图被加载修改,并且所有这些。setupPublisher
时,系统会调用此命令。在这里,当我尝试打印session:streamCreated:
值时,它会变为一个,同样许多其他变量也会变成type
,这会导致仅提供音频和视频。如果调用第一个nil
(收到第一个视频,然后单击连接),则流程正常,session:streamCreated:
中的print语句正确打印session:streamCreated:
值为2。
有人帮我弄清楚发生了什么。
我想知道为什么type
值会发生变化&各种其他变量变为type
。这样可以防止视频显示。我错过了什么吗?是否已采取任何其他实例(但我使用的是单例实例)?
答案 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模型,将您自己的模型对象设置为委托。然后,您可以在控制器发生有趣变化时通知他们。我已经创建了一个图表来演示:
在此图中,所有向下的实心箭头都是拥有引用。 VideoConference
将是您自己的类,它将实现OTSessionDelegateProtocol
。在初始化时,VideoConference
实例将创建并拥有OTSession
实例。当A类或B类需要了解的事情发生时(例如远程用户上线),VideoConference
可以发送NSNotification,两个控制器都可以是观察者。这是useful article about NSNotifications。