用 Swift 做一个智能机器人聊天 App (3)

本篇文章中你将会学到

  • 从Parse服务器下载聊天数据并显示到TableView中
  • 实现发送消息功能,并加载到TableView中
  • 使用Alamofire网络请求库,调用图灵机器人api获得回复信息
  • 保存聊天信息到Parse服务器中
    首先下载本篇文章的初始项目,也就是上一篇文章完成的项目,如果你跟着我的文章做了,也可以直接打开上一篇文章的完成项目:
    百度网盘下载地址 

    从Parse服务器下载聊天数据并显示到TableView中

    打开 AppDelegate.swift文件,解除方法func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool中以下这行代码的注释:

    与Parse服务器建立连接。

然后打开ChatViewController.swift,找到viewDidLoad()方法,删除其中的假数据:

替换为函数调用,这个函数用于从Parse数据库加载聊天记录

新建initData()方法:

代码解释:
//1
新建查询,设置查询类为我们定义的Messages类,关于怎么在Parse服务器上新建这个类在我的第一篇文章有对应的讲解,点击查看
然后设置查询的顺序,按发送时间升序排列,也就是按照正常的聊天顺序排列。
//2这里是一个循环,遍历所有接收的数据,也就是query.findObjects()返回的数据,按照时间间隔(如果两个消息前后间隔小于120秒将存入同一区)进行聊天消息的分区,就是//3所示部分。
由于可能存在消息已经获取的情况,所以将第二部分用一个if判断包裹起来,如果消息数小于1时才执行(消息数组默认情况下含一个空的数组元素):

如果没有错误,运行一下,应该能正常显示出聊天记录


 

iOS Simulator Screen Shot 2015年9月7日 上午10.42.14.png

实现发送消息功能,并加载到TableView中

我们的发送按钮sendButton已经添加了事件监控,只要实现监控方法即可:

新建sendAction()方法:

//1将新的消息添加到消息数组
//2我们虽然只有一个消息需要添加,但是我们要增加两行cell,因为我们要留出一行来显示发送时间。

告诉我们的系统tableView开始执行更新

插入一个新分区,这个分区将有两行cell,第一行显示发送时间,第二行显示消息。

执行行插入,并告诉系统我们的TableView更新完成!

TableView滚动到我们新添加消息的位置,当然这个函数还没有定义,还有updateTextViewHeight()方法也是,这个函数是为了更新输入框的高度来适应tableView的高度,在sendAction()方法下方添加这两个帮助方法:

我们还需要实现一个textView的代理方法,用来根据输入框有文字与否来决定sendButton是否可以被点击:

然后运行一下,现在应该可以发送消息了,当然我们是收不到回复的,下面我们就要使用Alamofire实现这部分功能!

使用Alamofire网络请求库,调用图灵机器人api获得回复信息

首先注册图灵机器人,来得到apikey:
图灵机器人注册
ps:这里有一点小私心啦,点这个链接注册可以给我的api升级1000/天的权限,谢谢大家的支持!

注册完成并登陆之后,点击个人中心:


 

屏幕快照 2015-09-07 下午3.34.26.png

找到apikey:


 

屏幕快照 2015-09-07 下午3.37.13.png

接下来在AppDelegate.swift中添加一些全局常量,在import下方,@UIApplicationMain上方:

api_url是api的调用地址,userId可以随便起,这里的作用是告诉api,聊天的是同一个人,只是为了连接上下文的语义。
然后返回ChatViewController.swiftsendAction()方法中:

之后添加如下代码:

看起来很复杂是吗?没关系我们来详细讲解一下Alamofire的方法:
其实这里有两步,首先创建Alamofire的request对象:

  • 第一个参数是确定HTTP请求的方法,这里我们用GET方法
  • 第二个参数是HTTP请求的地址,是一个NSURL类型的对象,用我们的api请求地址来创建它
  • 第三个参数是HTTP请求的参数,是一个[String:String]类型的字典类型
    这里我们要求三个参数apikey,发送的消息和uerid

然后调用responseJSON函数,因为我们的api返回一个json格式的数据。
该函数有两个参数,一个是读取JSON的选项,.MutableContainers是指定返回的对象序列化为可变的字典对象,第二个参数是一个尾随闭包(NSURLRequest, NSHTTPURLResponse?, AnyObject?, NSError?) -> Void,用来对返回内容进行处理,这个闭包有四个参数,URL请求, URL反馈, JSON对象,最后一个是错误。
我们只需要返回的JSON对象,和错误信息,所以前两个参数可以省略,用_表示。

在处理时,首先判断是否有错误,若有错误就打印错误信息:

在用if let语法对对象进行强制拆包,然后就可以用返回的消息构造我们的Message对象了。
填充到tableView的过程和上面对发送消息的处理类似,要注意的一点是我们这次不用插入新的分区了,因为发送和接收消息几乎是同时发送的,间隔肯定小于2分钟,而且只需要插入一行到当前分区的第三行,第一行和第二行分别是时间标签和发送消息。
然后运行一下,应该就能接收到来自萌蠢机器人的消息了!( ⊙ o ⊙ )
不过还有一些消息并不能显示出来,比如你问他”今天北京到上海的航班”:


 

iOS Simulator Screen Shot 2015年9月7日 下午9.53.38.png

额,航班信息在哪?难道是我们的机器人傻到忘记发给我们了??/(ㄒoㄒ)/~~
当然不是,一定是哪里出了错,我们来打印一下返回的json数据:

噢!原来它还返回了一个网址!那么我们怎么处理他呢,我们这里用一个简单的方法,如果json数据里存在这个url的时候,点击气泡就会打开这个url,在MessageBubbleTableViewCellMessage类中各添加一个属性:

然后稍稍修改一下sendAction方法中Alamofire函数调用,将这一行

修改为:

增加一个tableView的代理方法:

返回nil是因为我们只想知道哪个cell被按了,但是并不想让它变成高亮状态。
这样应该会起作用了!再运行一下看看效果:

 

打开url

(O_O)?看来机票都卖完了。。不过细想也对,都晚上11点了怎么还会有机票卖。。。O__O”…
其实还有其他更复杂的情况,比如你对他说红绕肉怎么做,返回的则是这样一个json数据:

参数 说明
code 状态码
text 文字内容
name 名称
info 详情
detailurl 详情链接
icon 图标地址

这些数据我们暂时先不处理,以后会进行一些改进。

保存聊天信息到Parse服务器中

这相对来说就简单一些,新建一个保存消息的方法:

然后再每次创建Message类的实例后调用这个方法,具体是sendAction方法中开头位置还有Alamofire函数调用的闭包内。
sendAction方法的完整代码现修改如下:

这里告诉大家一个小技巧,由于swift需要靠换行来区分语句,所以有的时候swift代码写多了看起来层次很不清楚,但是手动一行一行调整缩进很麻烦,所以选中需要调节缩进的部分,当然你也可以cmd+A全选( ⊙ o ⊙ ),然后control+I。duang~~,一切是那么地层次分明~你如果觉得太靠左边了,可以设置缩进的大小:

 

屏幕快照 2015-09-08 下午3.38.16.png

 

屏幕快照 2015-09-08 下午3.37.21.png

然后我们再运行一下app,细心的同学会发现,含有链接的聊天气泡点击后并没有反应,这是因为服务器上的Messages类并没有储存url这个属性,所以我们要调整一下数据库的类,打开Parse的控制面板,(关于Parse的注册和使用在我的第一篇教程里可以找到):

 

屏幕快照 2015-09-08 下午3.58.30.png

 

屏幕快照 2015-09-08 下午3.58.48.png

然后修改initData函数,在创建Message对象代码的下方添加如下代码,以便从数据库中取出url属性:

同样地,在我们保存消息的方法中也将url存入数据库对象,增加箭头所指的代码:


 

屏幕快照 2015-09-08 下午4.11.40.png

目前我们的app一切都好,只是在键盘弹出时有一些问题:

  • 在我们点出键盘时会遮挡消息:
     

    iOS Simulator Screen Shot 2015年9月8日 下午4.14.55.png
  • 键盘弹出时把tableView拉到底部会有一个很难看的空白:
     

    iOS Simulator Screen Shot 2015年9月8日 下午4.15.21.png

    还有一点需要说明,这个app没有更新到swift2.0还是使用Xcode6.4进行开发的,今后会更新到swift2.0

    本篇文章源代码下载

1 1 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部