前言
2017年是我感觉北漂以来过得最快的一年,依旧是安安稳稳、平平凡凡的一年。唯一的变故是离职换了新的公司,嘛,总结经验还是要有的。 更多 >>
欢迎光临~いらっしゃいませ~ (笑)
今天平安夜,十月番已经接近尾声,总结一下自己追的部分十月新番。十月番我一共追了这么几部:《干物妹!小埋R》、《如果有妹妹就好了》、《Just Because!》、《此花亭奇谭》。除此之外,还有《品酒要成为夫妻之后》这个短篇番。当然也弃了一部《关于我女友是个一本正经的处女碧池这件事》。 更多 >>
最近公司应用更新需要上传App Store预览视频,结果在使用Safari上传预览视频时毫无反应,上传失败.这种情况很大的可能是App预览视频格式/像素/码率等不符合苹果要求. 更多 >>
定义组件后为了供其他页面使用,我们需要将组件导出。
组件导出的关键字是1
exprot default
没有加default时,例如:1
export class TestComponent{}
我们可以在单个js文件里声明多个组件,例如TestComponents.js1
2export class TestComponent{}
export class AnotherTestComponent{}
这样在其他文件引用时,需要使用{}符号且组件名称必修和class名称一样,像这样子:1
import {TestComponent,AnotherTestComponent} from './components/TestComponents';
而加default时,例如:1
export default class TestComponent{}
然后在其他文件引用,像这样子:1
import TestComponent from './components/TestComponents';
你也可以为这个组件另起一个别名,像这样子:1
import MyTestComponent from './components/TestComponents';
但是每个文件里只能有一个default组件,可以包含其他非default组件:1
2export default class TestComponent{}
export class AnotherTestComponent{}
然后引用的时候,如下:1
import TestComponent,{AnotherTestComponent} from './components/TestComponents';
有default和没有default的区别在于:有default在引用时可以自定义名称,而没有default时需要使用{}括起来且名称必修和class名称一致
每个文件里只能有一个default组件,但可以有多个非default组件
最近iPhone系统更新到iOS 10.3后,在公司里用Charles抓包竟然出现了一些问题,https的请求都会失败,提示错误信息为Failure SSLHandshake: Received fatal alert: unknown_ca 和You may need to configure your browser or application to trust the Charles Root Certificate. 然而之前任何问题都没有,并且相关设置都正确:Mac上安装了Charles的根证书,并且设置了始终信任,然后手机上也登录了http://chls.pro/ssl安装了描述文件,一切都按正常程序走的,但是错误始终无法解决.这里Charles的相关使用不做介绍,不会使用的请参考本文结尾处唐巧大大的博文.
设置->通用->描述文件->charles proxy custom root certificate
虽然charles的根证书已经在安装列表中显示,但它是被关闭的。在iOS 10.3之前,当你将安装一个自定义证书,iOS会默认信任,不需要进一步的设置。而iOS 10.3之后,安装新的自定义证书默认是不受信任的。如果要信任已安装的自定义证书,需要手动打开开关以信任证书。
设置->通用->关于本机->证书信任设置-> 找到charles proxy custom root certificate然后信任该证书即可.
(http://oj12b6sh4.bkt.clouddn.com/Charles%E8%AE%BE%E7%BD%AE.jpeg)
问题虽小,但是很有必要普及一下.这个设置证书信任的开关界面隐藏的很深,是iOS 10.3之后出现的(貌似是,至少之前我没见过).这个问题因此也只有在iOS 10.3的设备上才会出现,真是太意外了!因此作为iOS开发者,更新手机系统时,了解一下系统更新的相关内容也变得很有有必要.
相关参考:
Charles 从入门到精通 - 唐巧的技术博客
TRUSTING CUSTOM ROOT CERTIFICATES ON IOS 10.3
公司之前的项目是由其他同事搭建的,随着公司业务的拓展,网络请求随之增加。网络工具类内部的代码愈发庞大,最终难以管理。为此寻找一个可行的解决方案,顺便学习一下RxSwift的使用。不说那么多底层原理,直接咱就说怎么用、怎么写,通俗易懂。文章附demo源码,由于本人也在学习中,所以代码中难免存在疏漏,存在问题可以互相讨论。
其中,数据解析部分(ObjectMapper)我们根据各自公司的习惯,可以选择Argo,SwiftyJSON等等其他框架,这不影响本博客内容。
Moya是一个网络抽象层库。它在Alamofire基础上提供了一系列简单的抽象接口,让客户端代码不用去直接调用Alamofire,同时提供了很多实用的功能。
Moya的TargetType协议规定使用枚举来创建网络请求,我们可以通过枚举来区分不同业务的网络请求。例如:
1 | enum UserAPI { |
这里我们使用demo里ApiExample的实例,分别表示一个get、post和一个上传图片的请求,下载的请求一般只有特殊的业务里才会用到,这里不做展示。
1 | enum ApiExample { |
定义请求枚举完成后,我们需要在枚举的拓展里实现Moya的TargetType协议。
1 | extension ApiExample: TargetType { |
这里对几个特殊的参数做出解释。sampleData是单元测试等等需要的假数据,只有在有测试的需求下才用得到,一般我们返回一个空的数据就可以。parameterEncoding是参数编码方式,通常我们使用URLEncoding就可以,根据不同的需求去选择,如实例中注释代码。
如果我们想在请求前和请求后做一些操作,Moya提供自定义请求插件来实现这一需求。比如我们要做请求完成前显示菊花,请求完成或失败后隐藏菊花,我们可以这样做。自定义插件需要遵守PluginType协议,根据不同需求实现协议里的方法。实例:
1 | public final class RequestLoadingPlugin: PluginType { |
我们使用ObjectMapper解析数据映射为model,ObjectMapper的使用这里不作介绍,请看官方文档。
我们为RxSwift中Observable写一个拓展,用于解析数据。通常我们服务器后台返回的数据格式类似以下形式:
1 | // success |
所以在拓展里面提供两个方法去解析模型和数组,并可选的传入key值来解析返回的json数据中字典对应的key值。
1 | func mapObject<T: Mappable>(type: T.Type, key: String? = nil) -> Observable<T> { |
另外我们可以自定义错误类型来处理数据解析中发生的错误。
1 | enum RxSwiftMoyaError: String { |
有时候请求是成功的,但是请求内容是错误的,错误信息由我们的服务器返回,如前文提及。所以我们在这个拓展里提供了一个方法解析服务器返回的错误信息,若有错误则抛出,无则返回nil
1 | fileprivate func parseError(response: [String: Any]?) -> NSError? { |
现代编程语言都很好的支持了异步编程,因此在swift编程中,拥有功能强大且轻量级的异步编程工具的需求变得很强烈。
这是PromiseKit中提到的,所以我们不甘落后,也想也来一发。
如官方文档中提到的异步链式调用,这很常见。详细使用请看官方文档,这里不做介绍。
1 | login().then { json in |
例如,在本demo中我们使用MVVM模式。在viewModel中我们处理网络请求。在demo中ViewModelExample文件内,我们书写以下代码,来创建一个Promise(异步任务)。
1 | func getHomepagePageData() -> Promise<HomepageData> { |
我们使用Moya的RxSwift拓展,来创建一个Provider,用于请求数据。在这里,我们创建Provider时可以自主选择插件,用于不同的需求。例如有些网络请求我们并不希望用户看到,所以不需要出现加载提示(如菊花,等等),我们在创建时就不需要加入插件。反之,我们可以在创建Provider时加入所需的插件以适应不同的需求。因此Moya变得更加灵活。实例:
1 | let provider = RxMoyaProvider<ApiExample>(plugins: [RequestLoadingPlugin(),NetworkLogger()]) |
我们在控制器里添加一个viewModel的实例,然后在网络请求的方法是实现viewModel中的方法即可。实例:
1 | lazy var viewModel = ViewModelExample() |
通过PromiseKit直接链式调用,我们很简洁的处理数据和错误。通过Moya和RxSwift,我们发送请求和解析数据也变得灵活机动干净利落,不拖泥带水。同时因为我们通过枚举来管理不同业务的请求接口,代码逻辑也变得清晰。
总之,Moya+PromiseKit+Swift 所谓优雅的书写网络请求,非常值得尝试一下!
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true