CORONA 开发记录

CORONA 开发记录

开发流程

  • 先实现界面流程,将测试数据移入data调用方法中
  • 对于请求远程数据的,可以先在data中将方法写好,然后接口留着,前期以测试数据填充开发
  • 前端开发好后,再进行编写后台实现以及和data模块中的交互

MVC 组织架构

  • M : 用于保存app的数据的lua文件,一般以类似 XXXData.lua 这样的方式命名
  • V : 用于展示界面的lua文件,也是平时用的最多的绘制界面ui的lua文件
  • C : 用于操作数据,并处理数据呈现出来的lua,一般以类似 XXXSrv.lua 这样的方式命名

注意:

这里并没有严格按照MVC的结构组织代码。 开发实践中发现,如果严格按照MVC的结构组织的话,会把很多简单的控制流程复杂化。
因此,这里使用的结构是这样的:
1、Data中还是持有缓存或用于各模块之间同步的数据。并提供操作其数据的相应方法,在某些需要的场景下,还可以直接操作该数据而不是通过方法间接的操作数据。
2、控制层(Service)中功能弱化,转变为只负责与服务器通信,并将远程和本地的数据做同步处理。也就是说,在页面中如果需要获取远程数据,调用的方法应该是在Data模块中的方法,只不过在该方法中调用了Service的方法去请求了远程的数据

请求 (request)

请求类型

  • 重请求,界面的展开依赖的请求,如果该请求失败的话,页面的绘制或其它的功能受到严重的影响的请求。比如,如果打开一个展现数据详情界面,而该请求远程数据还没返回时,该界面将无法正常绘制。

  • 弱请求,该请求并不会对之后的操作造成影响,甚至该请求在断网的情况下可以缓存该请求,等下次联网时再做请求亦可。典型的使用场景比如,标记某个课程的点赞。

请求处理

根据以上的请求类型故而存在两种的处理方式:

  • 重请求,每次产生的请求会生成一个 requestId ,将该id缓存在一个键名下,并且界面的后续处理必须等到该请求返回时才能进行,也就是必须在该请求的回调函数中处理。如果下次再产生同一键名的请求时,需要先处理上一次的请求是否成功,如果还未返回的话,需要先清理掉上一次的请求后才进行本次请求的后续动作

  • 弱请求,每次产生的请求放在一个堆栈中,等联网时一次发送这些请求。所以,依赖该请求的界面处理,不需要放在该请求的回调中,只需要直接处理客户端的操作就行。

开发时需要注意:

  • 对于重请求,假设场景为在弹出框中发送了请求,而页面部分需要请求回来的数据,这个时候需要注意当存在网络延迟的时候会出现页面加载过长,所以在实现时需要将刷新页面操作放入到回调中,不阻塞页面的刷新。

开发知识点

Corona
  • network.upload ,在下载图片时,对于404的情况,其event.isError为false,所以需要使用event.status进行判断
  • module 的路径是以相对main.lua进行计算的
  • 加载module是将其作为匿名函数体执行,所以在module中进行函数声明不需要进行前置声明
  • Tutorial: Advanced TableView Tactics
-- decode 方法处理url参数,并以table形式返回
-- unescape 处理url中的空格和其它特殊符号

local function unescape(s)
    s = string.gsub( s, "+", " " )
    s = string.gsub( s, "%%(%x%x)", function(h)
                    return string.char( tonumber( h ,16 ) )
                 end)
    return s
end
local function decode( s )
    local cgi = {}
    for name,value in string.gmatch( s, "([^&=]+)=([^&=]+)" ) do
        name = unescape(name)
        value = unescape(value)
        cgi[name] = value
    end
    return cgi
end
Lua
  • 判断table是否为空,可以用next(变量)~=nil,兼容数组和map
  • 对于boolean和table类型的变量不能使用” .. “操作符连接,可以改用 tostring(变量) 这个方法代替
  • 编写模块时,如果使用module(…,package.seeall),三个点好代表加载该模块的全局变量名为文件名,并且该模块文件下的全局变量都为模块的成员变量,引入seeall声明在模块内可以用过_G中的函数和变量
  • 开发module时,module关键词方式创建不推荐使用,因为会将其注册成全局变量,建议直接创建table然后返回其table
  • require 加载模块内部实现保证了其加载一次性(注册到page.loaded[name]),不会重复加载
  • 分析提取url中的部分信息,通过 socke.url 库的parse方法实现。具体获取详细参数部分,通过comment中的decode方法可获取
  • 逻辑运算,andor :1、除了nilfalse为假,其它的值都为真。2、对于 a and b,如果a为假,表达式的值为a;反正若a为真,则表达式的值为b。3、对于 a or b,如果a为假,表达式的值为b;反之若为真,则表达式的值为 a。4、andor 都是短路运算。
  • 基于以上特性,可简化的逻辑语句:1、x = x or v 等同于,if not x then x=v end。2、三目运算( a ? b : c )的等同实现,前提b必须为真。(a and b) or c

你可能感兴趣的:(APP,lua,corona)