I Promise U 实践

2019-07-04 11:19:15 浏览数 (1)

上一篇我们基本解除到了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的数据爬取

0 人点赞