我们创建了任务,以从服务器接收程序信息并处理数据。数据处理完成后,将通过设置响应字段来通知任务,并在如下屏幕中为它的观察值注册屏幕时得到通知。
屏幕:
m.FetchSchedule = CreateObject("roSGNode", "FetchScheduleData")
m.FetchSchedule.scheduleRequestContent = channels
m.FetchSchedule.observeField("scheduleContent", "didReceiveInitialScheduleData")
m.FetchSchedule.control = "RUN"
屏幕中的观察者功能:
sub didReceiveInitialScheduleData()
if m.FetchSchedule.scheduleContent <> invalid and m.FetchSchedule.scheduleContent.getChildCount() > 0 and m.FetchSchedule.totalRows > 0
? "GuideScreen.brs - [didReceiveInitialScheduleData]"
end if
end sub
这可以很好地解决单个任务的所有问题。,但是我们需要获取所有类别的频道的节目信息。现在,我们按顺序执行此操作,这意味着一旦为一个类别完成了任务,我们将为另一个类别创建另一个任务。 这工作正常,但需要花一些时间,因为我们要依次进行。
为减少延迟,我们试图为每个类别创建一个任务并尝试同时运行。但无法思考如何修改观察者函数。
在屏幕上创建多个任务的代码:
for x = 0 to m.global.AllNeighborhood.count() - 1
m.FetchSchedule[x] = CreateObject("roSGNode", "FetchScheduleData")
m.FetchSchedule[x].scheduleRequestContent = channels
m.FetchSchedule[x].categoryIndex = x
m.FetchSchedule[x].observeField("scheduleContent", "didReceiveInitialScheduleData")
m.FetchSchedule[x].control = "RUN"
end for
我们将线程索引传递为“ categoryIndex”。但是无法修改观察者函数“ didReceiveInitialScheduleData”。因为我们需要观察者函数的索引来访问响应。即使我们将索引保存为“ categoryIndex”,即使要访问它,我们也需要索引。我们被困在这里。
任何人都可以让我们知道是否可以使用相同的观察者功能创建多个任务。如果可能,我们如何从哪个线程知道响应。如果不可能,是否有办法解决此问题。
答案 0 :(得分:1)
通过在观察者回调函数中指定参数,您可以访问触发事件的节点。
sub didReceiveInitialScheduleData(message as Object)
task = message.getRoSGNode()
? task.scheduleContent 'This will print the respective task's scheduleContent field
...
end sub
这样,无论何时调用回调函数,您都可以确切知道是哪个任务触发了它,并且可以轻松访问其响应。