Appcelerator应用程序结构的最佳实践

时间:2011-08-22 08:05:26

标签: appcelerator-mobile

我正在重新设计我的iOS Appcelerator应用程序第三次尝试找到组织和开发它以优化速度和内存使用的“最佳”方式。

我希望能够:

  1. 使用自定义UI组件。
  2. 向远程REST API发出请求。
  3. 使用数据库进行本地存储/缓存。
  4. 我需要将这些“部分”作为单独的“模块”。

    哪种方式最好实现这一目标?我想也许是一个很好的MVC结构?请分享想法,资源和最佳实践。非常感谢所有的投入!

1 个答案:

答案 0 :(得分:1)

首先去源this great talk by Kevin Whinnery on Best Practices。这个讲话几乎完全包含了你所寻找的内容:

  1. 跨平台UI方法 - (如果您想跳过这个,2号从14:35开始)
  2. 面向组件的应用程序
  3. 模块化Javascript技术
  4. 代码演练!
  5. 另外,我强烈建议在创建新项目时使用模板应用程序,这些模板通常支持Kevin所谈论的概念,侧重于模块化开发。这些只应与Titanium SDK>一起使用。 1.8。

    要记住(并利用)的好处是Titanium可以像任何其他Javascript环境一样使用,因此可以使用诸如“require.js”之类的精彩内容(建议这样做)。

    这里有一些代码可以满足您的三个要求


    自定义UI组件(使用CommonJS!)

    要创建自定义组件(缺少模块),我个人使用CommonJS方法,使用module.exportsrequire()命令之类的东西。以下是名为DetailView.js的假装文件中的自定义UI组件的示例:

    function DetailView(argumentString) {
        var self = Ti.UI.createView(); // Create the base view, we 
    
        var lbl = Ti.UI.createLabel({
        text:'Please select an item named '+agumentString,
        height:'auto',
            width:'auto',
        color:'#000'
        });
        self.add(lbl);
        return self;
    };
    
    module.exports = DetailView; // This makes this component available when we require() it
    

    这只是包装标签的小型自定义模块,您可以添加额外的标题字符串。要创建此模块,只需根据CommonJS模型使用require

    app.js

    // Init our custom component, use it just like any other titanium UI element
    var infoView = require('InfoView')('title argument');
    // Add to the window
    var win = Ti.UI.currentWindow
    win.add(infoView);
    



    向远程REST API发出请求

    很容易做到,继承代码,你也可以轻松地将它包装在CommonJS模块中。

    // Create the object to send (JSON)
    var obj = {title : 'A fancy title'};
    
    // Create the HTTP object
    var xhr_getstep = Titanium.Network.createHTTPClient();
    // Listener for the response
    xhr_getstep.onload = function(e) {
        // Do something with the response
        var response = this.responseText;
    };
    Listener / callback for the error
    xhr_getstep.onerror = function() {
        Ti.API.info('[ERROR] WebService failed');
    };
    xhr_getstep.open("POST", 'http://yourwebsite.com/webservice/');
    xhr_getstep.setRequestHeader("Content-Type", "application/json");
    xhr_getstep.send(obj); 
    



    使用数据库进行本地存储/缓存。

    这也很简单(如果你想使用SQL,noSQL可能需要更多设置)。 实际上,这只是利用API check the docs here.

    作为一个简单的例子,从资源目录(带有名为users的表,以及两个字段名,“UserID”和“FirstName”)加载数据库并从中加载SELECT:

    var db = Titanium.Database.open('usersDB.db'); // Open database
    var dbrows = db.execute('SELECT * FROM users');
    while (dbrows.isValidRow()) {
        var userID = dbrows.fieldByName('UserID');
        var fname = dbrows.fieldByName('FirstName');
    
        // Trigger UI event, populate table, whatever you want
        //.......
    }
    

    希望这些示例可以帮助您布局模块化架构!他们帮助我保持了很多应用程序的理智。

    编辑:作为关于MVC的补遗。 Titanium用户群的很大一部分使用Appcelerator MVC和TiMVC,我不是真正的粉丝(我觉得我放松了语言的一些功能和灵活性)但是很容易使用MVC框架这也是。