Unruly的博客

心存善念,必有善行;善念善行,天必佑之。


  • 首页

  • 归档

  • 标签

  • 分类

  • 关于

浅谈小程序

发表于 2018-04-06

特点

  • 触手可及
  • 用完即走
  • 无需安装卸载
阅读全文 »

iOS博客推荐

发表于 2018-04-06

喵神 对 Swift 技术在国内的推广做了很大的贡献。

  • OneV’s Den
阅读全文 »

RxSwift

发表于 2018-01-18

RxSwift核心

Rx介绍

  • 基于异步 Event(事件)序列的响应式编程
  • 简化异步编程方法,并提供更优雅的数据绑定

Observable - 产生事件

创建序列

Observable.create

Event - 事件

  • onNext
  • onError
  • onCompleted

特征序列

Single

  • 它只能发出一个元素,或者一个Error事件
  • 场景:网络请求,返回应答或错误
  1. 创建同Observable相似
  2. 订阅提供SingleEvent枚举
    • success - 产生一个单独的元素
    • error 产生一个错误

Completable

  • 它只能发出一个completed事件,或者一个Error事件
  • 场景:判断任务是否完成
  1. 创建同Observable相似
  2. 订阅提供SingleEvent枚举
    • completed - 产生完成事件
    • error 产生一个错误

Maybe

  • 发出一个元素或者一个 completed 事件或者一个 error 事件
  • 场景:如果你遇到那种可能需要发出一个元素,又可能不需要发出时,就可以使用 Maybe

Driver

  • 不会产生 error 事件
  • 一定在 MainScheduler 监听(主线程监听)

1.创建普通序列.asDriver()
2.订阅使用drive

Signal

  • 不会产生 error 事件
  • 一定在 MainScheduler 监听(主线程监听)
  • Driver 会对新观察者回放(重新发送)上一个元素,而 Signal 不会对新观察者回放上一个元素

ControlEvent

  • 不会产生 error 事件
  • 一定在 MainScheduler 订阅(主线程订阅)
  • 一定在 MainScheduler 监听(主线程监听)

Subjects - 订阅 + 响应事件

PublishSubject

  • 不需要初始值创建
  • 只能收到订阅后的Event

BehaviorSubject

  • 需要一个默认值创建
  • 能收到订阅后上一个Event,之后新的Event正常

ReplaySubject

  • 在创建时候需要设置一个 bufferSize,表示它对于它发送过的 event 的缓存个数

BehaviorRelay替代Variable

  • 它的本质其实也是对 BehaviorSubject 的封装,所以它也必须要通过一个默认的初始值进行创建
  • BehaviorRelay 有一个 value 属性,我们通过这个属性可以获取最新值。而通过它的 accept() 方法可以对值进行修改

Operator - 创建变化组合事件

Disposable - 管理绑定(订阅)的生命周期

Schedulers - 线程队列搭配

Core Animation

发表于 2017-11-08

继承结构

  • 核心动画中所有类都遵守CAMediaTiming。
  • CAAnaimation是个抽象类,不具备动画效果,必须用它的子类(CAAnimationGroup和CATransition)才有动画效果。
  • CAAnimationGroup(动画组),可以同时进行缩放,旋转。
  • CATransition(转场动画),界面之间跳转都可以用转场动画。
  • CAPropertyAnimation也是个抽象类,本身不具备动画效果,只有子类(CABasicAnimation和* CAKeyframeAnimation)才有动画效果。
  • CABasicAnimation(基础动画),做一些简单效果。
  • CAKeyframeAnimation(帧动画),做一些连续的流畅的动画

常用属性

  • duration:持续时间,默认值是0.25秒
  • repeatCount:重复次数,无线循环可以设置HUGE_VALF或者CGFLOAT_MAX
  • repeatDuration:重复时间
  • removeOnCompletion: 默认为YES,代表动画执行完毕后就从图层上移除,图形会恢复到执行动画之前的状态。如果想要图层保持显示动画执行后的状态,那就设置为NO,同时设置fillMode为kCAFillModeForwards
  • fillMode:决定当前对象在非active时间段的行为
  • beginTime:可以用来设置动画延时执行,若想延迟2s,就设置为CACurrentMediaTIme() + 2
  • CACurrentMediaTIme():图层的当前时间
  • timingFunction:速度控制函数,控制动画运行节奏
  • delegate:动画代理

锚点

iOS常见问题及解决方案

发表于 2017-09-23

嵌套UIScrollview的滑动冲突解决方案

  • 没故事的卓同学 - 嵌套UIScrollview的滑动冲突解决方案

  • 军_andy - iOS 嵌套UIScrollview的滑动冲突另一种解决方案

  • 特斯拉组件 ios高性能PageController

  • 类似半糖、美丽说主页与QQ音乐歌曲列表布局效果

  • iOS开发实战 - 完美解决UIScrollView嵌套滑动手势冲突

DeepLink

  • H5主流浏览器下App导流方案选取

CocoaPods

发表于 2017-08-09

CocoaPods 使用

项目支持pod

  • cd 项目目录
  • 建立配置文件 vim Podfile
  • - 编辑 Podfile
    • platform :ios, ‘8.0’
    • target “TextDemo” do
    • pod ‘AFNetworking’
    • end
  • pod install

修改pod 版本

  • pod –version
  • gem list
  • 安装版本 sudo gem install cocoapods -v 1.0.0
  • 移除版本 sudo gem uninstall cocoapods -v 0.36.0

CocoaPods建立自己的Podspec

  • 创建podspec文件 pod spec create TextDemo
  • 编辑podspec文件
  • - 验证podspec
    • pod spec lint 本地校验
    • pod lib lint 远程本地检验
  • - podspec验证失败错误排查
    • ^ 文件语法错误
    • –verbose 查看详细错误
    • .a静态库错误 解决:可以使用 –use-libraries 通过
    • -allow-warnings 允许警告
    • 用了Swift库的同学都知道必须加上use_frameworks! 这个标记是说Pod管理的依赖全部编译为动态库,然后呢我们的很多组件又依赖了诸如百度地图,微信分享等静态库 会报 上面静态库的错误 解决:把静态库放到你自己的 pod 内,自己 vendor 这个静态 framework 参考文章
    • Don’t forget to anonymize any private data! 解决:重新安装cocoapods gem install cocoapods
    • include of non-modular header inside framework module解决: pod lib lint –verbose –allow-warnings –use-libraries
    • 静态framework问题:将framework 打包成.a 参考
  • 使用 Trunk 发布 pod trunk register 邮箱 “名字”
  • pod trunk push –allow-warnings –use-libraries
  • 版本升级

优秀文章: 玩转iOS开发《创建CocoaPods开发库》

关于组件化

发表于 2017-06-16

主要方案:

  • URL注册方案
  • Target-Action runtime调用方案
  • Protocol注册方案
阅读全文 »

Block 详解

发表于 2016-11-16

概述

iOS SDK 4.0开始,Apple引入了block这一特性,它是带有自动变量的匿名函数。先来看看block的经典用法:

1
2
3
[UIView animateWithDuration:0.3 animations:^{
//code
}];
阅读全文 »

源码分析 - SDWebImage

发表于 2016-07-16 | 分类于 源码分析

过程

SDWebImage 中为 UIView 提供了一个分类叫做 WebCache, 这个分类中有一个最常用的接口, sd_setImageWithURL:placeholderImage:, 这个分类同时提供了很多类似的方法, 这些方法最终会调用一个同时具有 option progressBlock completionBlock 的方法, 而在这个类最终被调用的方法首先会检查是否传入了 placeholderImage 以及对应的参数, 并设置 placeholderImage.

然后会获取 SDWebImageManager 中的单例调用一个 downloadImageWithURL:… 的方法来获取图片, 而这个 manager 获取图片的过程有大体上分为两部分, 它首先会在 SDWebImageCache 中寻找图片是否有对应的缓存, 它会以 url 作为数据的索引先在内存中寻找是否有对应的缓存, 如果缓存未命中就会在磁盘中利用 MD5 处理过的 key 来继续查询对应的数据, 如果找到了, 就会把磁盘中的缓存备份到内存中.

然而, 假设我们在内存和磁盘缓存中都没有命中, 那么 manager 就会调用它持有的一个 SDWebImageDownloader 对象的方法 downloadImageWithURL:… 来下载图片, 这个方法会在执行的过程中调用另一个方法 addProgressCallback:andCompletedBlock:forURL:createCallback: 来存储下载过程中和下载完成的回调, 当回调块是第一次添加的时候, 方法会实例化一个 NSMutableURLRequest 和 SDWebImageDownloaderOperation, 并将后者加入 downloader 持有的下载队列开始图片的异步下载.

而在图片下载完成之后, 就会在主线程设置 image 属性, 完成整个图像的异步下载和配置.

总结

  • 查看缓存
    • 缓存命中
      • 返回图片
      • 更新UIImageView
    • 缓存未命中
      • 异步下载图片
      • 加入缓存
      • 更新UIImageView

技术点

  1. dispatch_barrier_sync
  2. NSMutableURLRequest
  3. NSOperation
  4. NSCache
  5. LRU(最近最少使用)算法清除缓存
  6. 图片解码

Hello World

发表于 2016-03-15

Hello, I am Ming Yan, welcome to my personal blog.

一个农民,通过自身努力终于分到了一块地,不再需要在地主的土地上创造流量价值时,于是翻身作主的他可以宣告说:Hello World。当然这个农民确切来说是个码农。

1…34
Unruly

Unruly

40 日志
4 分类
71 标签
GitHub 微博
Links
  • kalman
© 2016 — 2019 Unruly
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4