hellolift学习笔记(6)

7.view Blog的实现2--CometActor
在viewblog方法中,当findAll方法返回一个有值的List时,使用了一个<lift:comet><lift:comet/>标签,这个标签的执行结果是,首先显示Loading...,然后刷新成指定用户的博客内容列表。如果在另一个浏览器去创建新的博客时,这个列表将自动刷新。
为了理解这个过程,需要了解Actor和Comet这两个概念。
i)Actor
Actor是scala用来简化并发和多线程开发的模型,在《Programming In Scala》Ch.30有较为详细的介绍。简单总结几点现在需要了解的内容
1)使用Actor需要继承scala.actors.Actor,并实现act方法,actor通过start()方法开始运行。
2)actor之间通过发送消息进行交互,发送消息通常的方法是! (!是Actor中定义的方法,类似的还有!!,!?)
3)接受消息的actor通常使用receive、react等方法从mailbox中提取消息并处理,这些方法的运行往往在loop中完成,这两个方法接受的参数是以下形式

react {
case (name: String, actor: Actor) => actor ! getIp(name)
case msg => println("Unhandled message: " + msg)
}

这是一种Case sequences as partial functions的语法(《Programming In Scala》ch15.7 P314)

ii)Comet
“Comet 是一种新的 Web 应用架构。基于这种架构开发的应用中,服务器端会主动以异步的方式向客户端程序推送数据,而不需要客户端显式的发出请求。Comet 架构非常适合事件驱动的 Web 应用。”具体可参考[url]http://en.wikipedia.org/wiki/Comet_(programming)[/url]。《The Definitive Guide To Lift》Ch.9(P168)也有一些介绍
在liftweb中Comet是通过actor来实现的;lift提供了CometActor trait,使用Comet时需要继承CometActor,并实现一些方法。

我们来看例子中的代码

<lift:comet type="DynamicBlogView" name={toLong(S.param("id")).toString}>
<blog:view>Loading...</blog:view>
</lift:comet>

type参数告诉lift使用哪个ComitActor类,在这里是com.hellolift.comet.DynamicBlogView;name是定义在CometActor中的属性,这里将用来传递用户id。
<lift:comet/>里内嵌了一个<blog:view/>标签,看一下DynamicBlogView中这个标签有关的的代码
 override def defaultPrefix = Full("blog")

这里定义了在这个<lift:comet>标签中用到的节点的前缀"blog"
 // render draws the content on the screen.
def render = {
bind("view" -> <span>{blog.flatMap(e => _entryview(e))}</span>)
}

这里定义了一个render方法,显然标签中的view,会被这里的view对应的节点所替代。
为了比较容易理解comet的执行过程,我简单总结了一下DynamicBlogView执行过程中的一些流程,很多地方不够准确,只是起到示意作用
[img]http://dl.iteye.com/upload/attachment/160729/d8c8f546-db80-38f1-a666-638b6c793399.jpg[/img]

从流程可以看到从comet这个snippet到DynamicBlogView这个CometActor实例的运行过程,[b]在snippet的render过程中启动了DynamicBlogView的start方法,在act loop中将调用lowPriority方法来处理消息。在有消息产生之前,还调用了localSetup进行初始化的工作,在snippet的render过程和消息处理的过程中都会调用render方法来产生页面内容。[/b]

理解这个comit主要就是理解各消息的发送和处理过程
1. localSetup中,向BlogCache发送一个同步(!?)的AddBlogWatcher消息,
2. BlogCache 在loop中处理这个消息根据用户id,加载博客列表并通过BlogUpdate消息返回给DynamicBlogView,同时把这个DynamicBlogView记录在session中(观察者模式),并在以后内容发生变化时发送通知消息。
3. DynamicBlogView 处理 BlogUpdate消息,将blog内容记录,供render展示。

4. 当其他增删改的操作改变博客内容时,BlogCache 将再次向DynamicBlogView 发送BlogUpdate消息,DynamicBlogView 在lowPriority中处理消息记录并刷新页面内容。


(终于把这个过程说完了,喘口气,其他的细节等有心情的时候再说了)

疑问:reRender方法的参数是什么作用,看代码没能跟下去求助一下

def reRender(sendAll: Boolean)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GeoPandas是一个开源的Python库,旨在简化地理空间数据的处理和分析。它结合了Pandas和Shapely的能力,为Python用户提供了一个强大而灵活的工具来处理地理空间数据。以下是关于GeoPandas的详细介绍: 一、GeoPandas的基本概念 1. 定义 GeoPandas是建立在Pandas和Shapely之上的一个Python库,用于处理和分析地理空间数据。 它扩展了Pandas的DataFrame和Series数据结构,允许在其中存储和操作地理空间几何图形。 2. 核心数据结构 GeoDataFrame:GeoPandas的核心数据结构,是Pandas DataFrame的扩展。它包含一个或多个列,其中至少一列是几何列(geometry column),用于存储地理空间几何图形(如点、线、多边形等)。 GeoSeries:GeoPandas中的另一个重要数据结构,类似于Pandas的Series,但用于存储几何图形序列。 二、GeoPandas的功能特性 1. 读取和写入多种地理空间数据格式 GeoPandas支持读取和写入多种常见的地理空间数据格式,包括Shapefile、GeoJSON、PostGIS、KML等。这使得用户可以轻松地从各种数据源中加载地理空间数据,并将处理后的数据保存为所需的格式。 2. 地理空间几何图形的创建、编辑和分析 GeoPandas允许用户创建、编辑和分析地理空间几何图形,包括点、线、多边形等。它提供了丰富的空间操作函数,如缓冲区分析、交集、并集、差集等,使得用户可以方便地进行地理空间数据分析。 3. 数据可视化 GeoPandas内置了数据可视化功能,可以绘制地理空间数据的地图。用户可以使用matplotlib等库来进一步定制地图的样式和布局。 4. 空间连接和空间索引 GeoPandas支持空间连接操作,可以将两个GeoDataFrame按照空间关系(如相交、包含等)进行连接。此外,它还支持空间索引,可以提高地理空间数据查询的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值