作者uranusjr (←这人是超级笨蛋)
看板MacDev
标题Re: [问题] Server回应client问题?
时间Thu Jun 20 18:35:34 2013
※ 引述《sick09843 (咚咚毕特)》之铭言:
: 请问一下各位
: 之前使用过Dropbox的api
: 例如说我要新增一个目录
: Dropbox的api在新增完目录之後
: 会有一个delegate告诉我已经新增完目录了
: 目前我自己实作了一个自己的云端硬碟
: 利用http post跟get取得电脑的档案并且操作
: 不过当我新增完目录之後
: 我利用http get进行档案操作
: 不过我不知道该怎麽从server端发出一个通知告诉client端我已经完成档案操作了
: 目前一点头绪都没有
: 请问有人有类似的经验或者可以告诉我一点方向吗?
: 感谢~
如同前一篇推文所述, HTTP 本身是 synchronous 的
所以如果你要做到 callback 的效果就必须用其他方法
我目前主要可以想到三大类...
第一种方法是在 client 端实作
这个应该是最单纯的, 开个背景 thread 来传资料, 传完之後呼叫一个 callback
实作方法也有很多选择, 各有各的优缺点
最古早的 NSURLConnectionDelegate 实作
用 GCD 包一个 +sendSynchronousRequest:returningResponse:error:
或者 +sendAsynchronousRequest:queue:completionHandler:
甚至用第三方函式库例如 AFNetworking
基本上随你高兴怎麽选(不过如果要传档请注意 multipart 的设定)
第二种方法是 polling
当 client 端把档案传过去时, server 可以回覆「档案收到了, 不过我还没处理完」
(这通常是用 status code 202 来表示)
然後给 client 一个 Location header, 让 client 定时去该位址检查处理是否完成
这个方法的缺点就是 client 必须主动检查, 而非被动等待, 所以会浪费资源
或者就是放大绝, 不要用 HTTP
在 iOS 上现成的方法就是 push notification
档案上传时顺便送一个 device ID 过去, server 处理完推播一个讯息回来就行了
或者 W3C 的 WebSocket 标准也可以做到 callback, 也有人在 iOS 实作了 client
但 push notification 有即时性的问题, WebSocket...不见得值得特地搞这个
总体来讲除非你有很特殊的需求, 第一类方法还是最合理
一般服务应该也都是采用这个方式
至於要怎麽实作 callback, 你就自己把关键字丢去喂大神研究吧
------
补充:
第一种方法的缺点是你只能知道 client 端状态, 无法即时更新 server 状态
所以像档案处理进度这种东西基本上只能用推测的
只有在连线的一些关键时刻(尝试开始、建立连结、断开连结等等)能得到 feedback
不是说就没有缺点...
--
Les grandes et les meilleurs
tone from "Zadok the Priest"
Eine grosse stattliche Veranstaltung
by F. Handel
THE MAIN EVENT! These are the men
Sie sind die Besten
"Champions League" by Tony Britten THESE ARE THE CHAMPIONS!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.32.81.146
※ 编辑: uranusjr 来自: 114.32.81.146 (06/20 18:39)