0%

iOS开发中,如果不进行适当的封装,使用协议或者继承类来进行开发,你就会遇到传说中的ViewController(以后简称VC) Hell的问题……

比如说,我们先声网App中为了调用接口,做简单的判断,会有如下的垃圾代码(前辈遗留下来的):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
override func viewDidLoad() {
super.viewDidLoad()

var color = UIColor(red: 153/255, green: 204/255, blue: 204/255, alpha: 1)
self.navigationController?.navigationBar.barTintColor = color

self.httpController.delegate = self

Config.shareInstance().isNetworkRunning = CheckNetwork.doesExistenceNetwork()

if Config.UUID == nil || Config.UUID!.isEmpty
{
Tool.showErrorHUD("去信息门户登录一下吧:)")
}
else if !Config.shareInstance().isNetworkRunning
{
Tool.showErrorHUD("貌似你没有联网哦")
}
else
{
Tool.showProgressHUD("正在更新校园网信息")
sendNicAPI()
}
// Do any additional setup after loading the view.
}

func sendNicAPI(){
let nicURL = "http://herald.seu.edu.cn/api/nic"
let parameter:NSDictionary = ["uuid":Config.UUID!]

self.httpController.postToURLAF(nicURL, parameter: parameter, tag: "nic")
}

func didReceiveDicResults(results: NSDictionary, tag: String) {
if let content:NSDictionary = results["content"] as? NSDictionary{
if tag == "nic"{
firstSend = false
Tool.showSuccessHUD("获取信息成功")
println(content.allKeys)
}
}
}

看到了吗,每个VC开头都得这样写一发,如果我们有20多个功能呢?会变成什么样子?

所以,这样下去是绝对不行的,必须对整个乱七八糟的初始化,发送请求,请求接受进行封装,这里就会用到Swift最有用的协议,代理,以及闭包了。

阅读全文 »

终于,我参加的第三个Web项目基本已经完成了Beta版本的整体架构和实现。

这次的Web项目要求,是制作一个基于Web(或者移动Web)的在线协作编辑平台,主要支持Markdown语法及同步预览,类似于Google Docs或者Office Online这样的东西(但是绝对不可能达到国际一流大厂的水平)

由于只有我们4个人开发(其中2个还算专门前端开发),所以尽可能减少后端开发压力,经过初步的讨论,最终选择了使用Node.js作为后端开发语言。Node.js强力的非阻塞IO和异步事件非常适合我们这种IO密集型的应用。而对于协作的部分,我们选择使用socket.io来进行这种密集文本数据的通信和广播,也能很大的减少开发周期。

嘛,整体架构大概这样,虽然很丑陋,对于我这种没有实际架构Web经验以及Beta版来说,已经足够了。

话不多说,作为一个多人编辑的平台,首先就需要传统的Web应用的老三样:用户管理,文档管理,项目管理,今天就主要说这些。

阅读全文 »

一年一度的圣诞节又到了……或许这又意味这一年的开始了。

这一年中,有很多人给了我帮助,有欢乐之时,也有低落之时。曾经以为自己能够找到自己的目标,却发现自己还是原地踏步。希望来年之时,心中这份迷茫能够或许减少一分吧。

感慨就到这里,希望在这个圣诞日子中,你我能够忘却烦恼,睁开眼睛发现属于自己的幸福,勇于追求自己的未来,不要被周遭而所困扰。

最后,谨祝愿:

自己能够追寻自己的梦想,看到这的你能够拥抱自己的幸福与喜悦。

最后,献上我的圣诞贺卡~

阅读全文 »

说来也是惭愧,从大一暑假接触到第一门Web后端语言——PHP之后,自己对Web应用程序的认识却一直没有多大改变,对整个Web服务器的运行也没有清晰的概念。不过,这个大二的寒假里面,由于需要架设一个Web多人协作编辑平台,我接触到了这个非常热门尽管国内应用不多的后端架设方式——Node.js

说到Node.js,其实很多人也都知道,一个JavaScript在本地的运行时,基于Google的V8引擎。很可惜,由于自己当时学习Web主要走的后端路线,自己对JavaScript的认识也就靠的是w3school的简单说明和了解以及简单的jQuery用法罢了。学Node.js对我印象最大的,就是事件驱动的回调函数。(其实还是与自己并未真正接触到函数式编程有关)

举个例子,就是最简单的Hello World Web应用程序。

1
2
3
4
5
6
7
var http = require("http");

http.createServer(function(request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello World");
  response.end();
}).listen(8888);

在JavaScript里面,函数是和变量同地位的一等公民,它可以被传递进当为参数,这种写法初次接触JavaScript的人肯定感觉非常不适应(尤其从Java,PHP转来的),不过习惯之后便发现这样带来了不错的易读性。这里面,那个匿名函数function(request,response)就是一个回调函数,Node.js内置的http对象通过listen进行8888端口的监听,一旦有任何访问便会调用这个回调函数,执行那三行来发送一个Hello World的HTML文本回去

Node.js编写Web程序的体验绝对是Java和PHP很难达到的,因为你不仅要写一个Web应用程序,必须自己写一个HTTP服务器程序。不过这也意味着你可以干更多的事而不用局限于PHP这种解释器一样执行的代码,很多人甚至不知道在一行简单的echo “Hello World!” 的背后的Web应用程序究竟是怎样工作的,你也可以不用再和Apache,Nginx这种Web应用程序的使用打交道,你可以自己写一个类似的出来,定制化更高。   上面关于Node.js的简单认识也就先这样,下面我想说说关于Web应用程序的非常简单的架构组织。

阅读全文 »

提到幻灯片,人人第一直觉就想到一个东西:PPT(Microsoft Office PowerPoint),也许还有人可能会小声说到 Keynote,或者Prezi,能提到reveal.js的基本少之又少……

PowerPoint:http://products.office.com/zh-CN/powerpoint

Keynote:http://www.apple.com/cn/mac/keynote

Prezi:http://prezi.com

reveal.js:http://lab.hakim.se/reveal-js

不过,常年用这些东西,未免也太”Low”了,我们需要追求更Fasion的幻灯片制方法。

阅读全文 »

接上一篇,我们有了好友关系之后,就又涉及到了怎么样处理“只能看到好友的动态,和好友在好友动态下的评论)

其实关于获取好友状态,已经不成问题,从数据库中读取出来就行了,最后统一出一个好友列表,然后进行查询就行了。关键的地方在于这个好友动态的排序以及评论呈现。

1、关于评论和动态的获取

我们采取的方式是:后端返回全部动态,前端进行排序。这样的好处是大幅减小了后端的压力,因为如果不这样,后端得依次进行如下操作:

获取当前用户 -> 获取用户的好友列表 -> 对每个用户的好友选择出所有动态 -> 对所有好友选择出来的动态进行排序 -> 对最后结果只返回前n个(后续的再次发送请求获取)

阅读全文 »

C++的指针是大一时期一直觉得头疼的一个东西。当年一直对指针敬而远之。一旦不小心,指针越界的后果就是程序崩溃……> <

然而,偶然一次学妹问到关于动态数组的问题的时候……才偶然发现当年自己学指针似乎一直没有搞清楚这两者的关系:

pointerpointer[i]

比如实现一个简单的动态数组,举例就是看如下代码:

第一种方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>

using namespace std;
int main(int argc, char *argv[]) {
int arrayInput;
int arraySize = 0;
int* arrayPointer;
cout<<"依次输入数字到这个数组中,输入EOF(Windows下为Ctrl+Z,Unix/Linux下为Ctrl+D)来停止输入"<<endl;
while(cin>>arrayInput){
arrayPointer[arraySize] = arrayInput;
arraySize++;
}
cout<<"现在输出数组中元素"<<endl;
for(int i = 0;i<arraySize;i++){
cout<<i<<"元素: "<<arrayPointer[i]<<" ";
}
}
阅读全文 »

上周学院举办了一个建模比赛中:http://www.ippclub.org/index.php/archives/33/

最后成品放在了github上面:https://github.com/lizhuoli1126/FriendCircle

为了实现这个朋友圈的关系,确实有很多值得思考的地方。

第一个难点就在于这种朋友关系的设计。

第一种方案就是最简单直观的方法:一条记录对应一个朋友关系,user1和user2是好友,relation为friend。但是这样导致的问题就是会出现一条重复纪录,因为 ‘朋友’ 是一个双向关系,所以不应当user1,user2,friend和user2,user1,friend重复出现。

阅读全文 »