上一篇我们基本解除到了Promise的概念,也了解了PromiseKit中的几个基常用的概念,这次我们就来个小实践:
开讲前先安利一波慢慢的更新了这么久终于达到门槛了,感谢大家的支持啊
最近呢浏览到一个壁纸网站,那是各种美图,但是呢?有不想每天总是刷然后在设置为电脑壁纸吧。
怎么办???
作为IT人员可定是从技术角度来处理这个事情----爬虫是首选。但是呢?没听说过swift有爬虫框架,好在啊咱们收集到一个xpath框--一个基于C封装的swift框架……是不是绝配啊
话不多说我们先看看战果,当然啦这只是其中一部分
这本书很推荐大家看看,尤其是IT技术宅
我们首先看一个实践过程中使用的一个另类的方式:
var urls = ["4kfengjing","4kmeinv","4kyouxi","4kdongman","4kyingshi","4kmingxing","4kqiche","4kdongwu","4krenwu","4kmeishi","4kzongjiao","4kbeijing","shoujibizhi"].map({ (item:String) -> String in
return [K4, item].joined(separator: "/")
}).makeIterator()
let generator = AnyIterator<Promise<Void>>.init { () -> Promise<Void>? in
guard let url = urls.next() else {
return nil
}
return firstly{
after(seconds: 10)
}.then({ _ in
return self.fetch(page: url)
})
}
when(fulfilled: generator, concurrently: 2)
.ensure {
print("完成结束")
}.catch { (e:Error) in
print(e)
}
以往使用这个多请求完成之后再往下走的方式我们很多采用 GCD的group来完成,或者采用barrier的方式来完成,但是GCD的回调方式让人在多层嵌套中不胜其扰,但是Promise的链式函数式操作让我们看到了新的姿势
我们来预览一下效果
是不是感觉过程清晰可见,是不是像打游戏一样,下一关 下一关……的爽利感觉
我们再开看看图片的保存
按照之前的block方式我们想要请求图片,然后保存,最终返回本地存储地址是需要一层层的block嵌套回调,但是有了promise之后我们不需要啦。只需要这样
1 发送网络请求
2 then 拿到图片数据
3 then 保存图片
4 then 文件路径传递到下一操作
5 done 结束
func save( img:String, to saveKind:SaveKind = SaveKind.thubnail)->Promise<String>{
return Alamofire.request(img)
.responseData().then({ (imgData:(data: Data, response: PMKAlamofireDataResponse)) -> Promise<String> in
return Promise{ seal in
do{
let path = [saveKind.filePath , imgData.response.request!.url!.pathComponents.last!].joined(separator: "/")
try imgData.data.write(to: URL.init(fileURLWithPath:path ))
seal.fulfill(path)
}catch{
seal.reject(error)
}
}
})
}
大致就这些,下一期我们安利xpath的知识点以及采用swift进行HTML的数据爬取