我正在重新设计我的iOS Appcelerator应用程序第三次尝试找到组织和开发它以优化速度和内存使用的“最佳”方式。
我希望能够:
我需要将这些“部分”作为单独的“模块”。
哪种方式最好实现这一目标?我想也许是一个很好的MVC结构?请分享想法,资源和最佳实践。非常感谢所有的投入!
答案 0 :(得分:1)
首先去源this great talk by Kevin Whinnery on Best Practices。这个讲话几乎完全包含了你所寻找的内容:
另外,我强烈建议在创建新项目时使用模板应用程序,这些模板通常支持Kevin所谈论的概念,侧重于模块化开发。这些只应与Titanium SDK>一起使用。 1.8。
要记住(并利用)的好处是Titanium可以像任何其他Javascript环境一样使用,因此可以使用诸如“require.js”之类的精彩内容(建议这样做)。
这里有一些代码可以满足您的三个要求
自定义UI组件(使用CommonJS!)
要创建自定义组件(缺少模块),我个人使用CommonJS方法,使用module.exports
和require()
命令之类的东西。以下是名为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框架这也是。