我们创建了任务来从服务器接收程序信息并处理数据。一旦数据处理完成,任务将通过设置响应字段进行通知,屏幕在observeField中注册响应时将收到通知,如下所示。
屏幕:
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"。因为我们需要observer函数的索引来访问响应。即使我们将索引保存为"categoryIndex",即使要访问它,我们也需要索引。我们被困在这里了。
有人能告诉我们是否有可能创建具有相同观察者功能的多个任务吗。如果可能的话,我们如何从哪个线程中知道,我们得到了响应。如果不可能,有没有办法解决这个问题。
通过在观察器回调函数中指定一个参数,您可以访问触发事件的节点。
sub didReceiveInitialScheduleData(message as Object)
task = message.getRoSGNode()
? task.scheduleContent 'This will print the respective task's scheduleContent field
...
end sub
这样,无论何时调用回调函数,都可以准确地知道是哪个任务触发了它,并可以轻松地访问它的响应。