获得徽章 0
#知识小集# 「 Go 语言 Channel 实现原理精要 」 by @draveness
作为 Go 语言中核心的数据结构和 Goroutine 之间的通信方式,Channel 是支撑 Go 语言高性能并发编程模型的结构之一。Go 并发一个重要理念是 `不要通过共享内存的方式进行通信,而是应该通过通信的方式共享内存`。
作者在这篇文章中从源码入手,详细分析了 Channel 相关的数据结构以及使用 Channel 的四个基本操作:创建、发送、接收和关闭,特别是针对发送和接收阶段的不同情况做了详细的拆解和分析,图文并茂。
对 Go 语言底层感兴趣的童鞋可以好好品读一下。
详情可查看:
draveness.me
作为 Go 语言中核心的数据结构和 Goroutine 之间的通信方式,Channel 是支撑 Go 语言高性能并发编程模型的结构之一。Go 并发一个重要理念是 `不要通过共享内存的方式进行通信,而是应该通过通信的方式共享内存`。
作者在这篇文章中从源码入手,详细分析了 Channel 相关的数据结构以及使用 Channel 的四个基本操作:创建、发送、接收和关闭,特别是针对发送和接收阶段的不同情况做了详细的拆解和分析,图文并茂。
对 Go 语言底层感兴趣的童鞋可以好好品读一下。
详情可查看:
展开
评论
2
「 追踪 Objective-C 方法中的 Block 参数对象 」 by @杨萧玉HIT
很多方法最后一个参数是类似于 completionBlock 这种回调,然而有些 API 实现一些异常逻辑时会忘记调用传入的 Block 参数(当然这肯定是 bug 啦),或者存在多次调用。在调试的时候可能会碰到这种大坑,需要追踪下 Block 参数何时调用了,甚至是否调用过。如果不方便直接在 Block 实现中加代码,或者没有源码的情况下,就需要无侵入式地追踪 Block 参数对象。
BlockTracker可以追踪方法调用时传入的 Block 类型的参数的执行和销毁。基于 BlockHook实现。本文讲述了它的使用方法和实现原理。
详情可查看:
mp.weixin.qq.com
很多方法最后一个参数是类似于 completionBlock 这种回调,然而有些 API 实现一些异常逻辑时会忘记调用传入的 Block 参数(当然这肯定是 bug 啦),或者存在多次调用。在调试的时候可能会碰到这种大坑,需要追踪下 Block 参数何时调用了,甚至是否调用过。如果不方便直接在 Block 实现中加代码,或者没有源码的情况下,就需要无侵入式地追踪 Block 参数对象。
BlockTracker可以追踪方法调用时传入的 Block 类型的参数的执行和销毁。基于 BlockHook实现。本文讲述了它的使用方法和实现原理。
详情可查看:
展开
评论
点赞
#知识小集# 「 机器学习新工具: Create ML App 」 by @故胤道长
Create ML 是苹果于 2018 年 WWDC 推出的生成机器学习模型的工具。它可以接收用户给定的数据,生成 iOS 开发中需要的机器学习模型。今年的 Create ML 在易用性上更进一步:无需编程即可完成操作、独立成单独的 Mac OS App、支持更多的数据类型和使用场景。
在操作流程上,苹果提供了单独的 Mac OS App,完全通过可视化界面来完成 选择模型类型并导入数据 -> 训练模型 -> 评估模型 -> 观察模型 的整个流程。
在应用场景上,今年增加到了图片、文本、表格、声音、活动5种。
Create ML 的最大优点在于,它是以用户需求为驱动、完全服务于 App 开发,相信在 iOS 13 后越来越多的开发者将会采用 Create ML 和 Core ML 开发应用。
xiaozhuanlan.com
Create ML 是苹果于 2018 年 WWDC 推出的生成机器学习模型的工具。它可以接收用户给定的数据,生成 iOS 开发中需要的机器学习模型。今年的 Create ML 在易用性上更进一步:无需编程即可完成操作、独立成单独的 Mac OS App、支持更多的数据类型和使用场景。
在操作流程上,苹果提供了单独的 Mac OS App,完全通过可视化界面来完成 选择模型类型并导入数据 -> 训练模型 -> 评估模型 -> 观察模型 的整个流程。
在应用场景上,今年增加到了图片、文本、表格、声音、活动5种。
Create ML 的最大优点在于,它是以用户需求为驱动、完全服务于 App 开发,相信在 iOS 13 后越来越多的开发者将会采用 Create ML 和 Core ML 开发应用。
展开
评论
1
赞了这篇沸点
#知识小集# 「 UIViewController 预加载方案浅谈 」 by @hite和落雁
预加载作为常规性能优化方法,在所有有性能需求的场景都有使用。在 iOS 常规的优化方案中,预加载也是极常见的方法,多见于:预加载图片、配置文件、离线包等业务资源。但是对于整个 App 的核心组件 UIViewController 却少见预加载的策略。
在本文中,作者在思考和调研了 UIViewController 渲染流程和特性后,提出了自己的解决方案 ViewControllerPreRender,对比了使用该方案前后的性能,并说明了背后的原理以及适宜的场景。
有类似需求的童鞋可以参考一下。
预加载作为常规性能优化方法,在所有有性能需求的场景都有使用。在 iOS 常规的优化方案中,预加载也是极常见的方法,多见于:预加载图片、配置文件、离线包等业务资源。但是对于整个 App 的核心组件 UIViewController 却少见预加载的策略。
在本文中,作者在思考和调研了 UIViewController 渲染流程和特性后,提出了自己的解决方案 ViewControllerPreRender,对比了使用该方案前后的性能,并说明了背后的原理以及适宜的场景。
有类似需求的童鞋可以参考一下。
展开
评论
1
#iOS知识小集#「 WWDC2019 专场特性 Vision FrameWork 」
Vision FrameWork 于 WWDC2017 推出,用来处理计算机视觉方面的任务,比如人脸检测、文本识别、条形码识别、图片处理,也可以自定义模型来处理一下任务,比如图片分类。
WWDC2019又丰富了Vision FrameWork 的特性,比如:检测图片的相似性,检测图中出现的对象(是否有人物、动物、植物等),对图片进行分类等等。
更多内容可以观看 session:
t.cn
今年,苹果在机器学习上又迈上了一个新的台阶,无论在学习成本与功能上都有了更大的提升。相信不久会有更多ML 方面的 App 逐渐与大家见面。期待机器学习在多媒体方面能更好地服务人类。
Vision FrameWork 于 WWDC2017 推出,用来处理计算机视觉方面的任务,比如人脸检测、文本识别、条形码识别、图片处理,也可以自定义模型来处理一下任务,比如图片分类。
WWDC2019又丰富了Vision FrameWork 的特性,比如:检测图片的相似性,检测图中出现的对象(是否有人物、动物、植物等),对图片进行分类等等。
更多内容可以观看 session:
今年,苹果在机器学习上又迈上了一个新的台阶,无论在学习成本与功能上都有了更大的提升。相信不久会有更多ML 方面的 App 逐渐与大家见面。期待机器学习在多媒体方面能更好地服务人类。
展开
评论
1
赞了这篇文章
#iOS知识小集#「 WWDC2019 专场特性 Combine 」
Combine 是这次大会新出的响应式框架,对标 Rx 类型的框架,比如 RxSwift、RxJava。
Combine 框架提供了一个声明性的Swift API,用于响应某些值的变化。这些值可以是用户操作UI的事件、网络响应、计划事件(比如Timer)和其它类型的异步数据,它以订阅发布的模式来处理事件。
有了这个框架,可以做更多的事情,比如 MVVM、回调地狱问题,可惜我只看到了 Swift 相关的 API,并未发现有 OC 的版本(Bridge除外)。从这次大会来看,很多东西都 Swift Only,比如 SwiftUI。
随着 Swift 支持越来越多的特性,App支持的最低版本越来越逼近iOS13。WWDC2019 只是一个开始,相信会有更多 Swift Only 的特性。该学习 Swift 了。
更多内容参考:
t.cn
Combine 是这次大会新出的响应式框架,对标 Rx 类型的框架,比如 RxSwift、RxJava。
Combine 框架提供了一个声明性的Swift API,用于响应某些值的变化。这些值可以是用户操作UI的事件、网络响应、计划事件(比如Timer)和其它类型的异步数据,它以订阅发布的模式来处理事件。
有了这个框架,可以做更多的事情,比如 MVVM、回调地狱问题,可惜我只看到了 Swift 相关的 API,并未发现有 OC 的版本(Bridge除外)。从这次大会来看,很多东西都 Swift Only,比如 SwiftUI。
随着 Swift 支持越来越多的特性,App支持的最低版本越来越逼近iOS13。WWDC2019 只是一个开始,相信会有更多 Swift Only 的特性。该学习 Swift 了。
更多内容参考:
展开
评论
1
赞了这篇沸点
WWDC19 06-04 Tuesday(美国时间) Session List
评论
1
#iOS知识小集#「 让异步单元测试更快更稳定 」
如何让让异步单元测试更快更稳定?John Sundell 给了我们三点建议:
1. 避免使用 sleep(),而是使用 expectations
2. 使用较大的 timeout 值从而避免 CI 上可能出现的超时问题
3. 将所有 assertion 放在测试结尾,而不是闭包里面
如何让让异步单元测试更快更稳定?John Sundell 给了我们三点建议:
1. 避免使用 sleep(),而是使用 expectations
2. 使用较大的 timeout 值从而避免 CI 上可能出现的超时问题
3. 将所有 assertion 放在测试结尾,而不是闭包里面
展开
评论
点赞
#iOS知识小集# 「 解决CocoaPods v1.7.0生成了多Xcodeproj 后的post_install问题」 @jkpang-庞
今天更新CocoaPods v1.7.0并生成多个Xcodeproj后,在设置这些子Projects、Targets相关配置参数时(post_install操作)遇到的问题,后来通过查看CocoaPods源码installer.rb文件找到了解决方案,只需在Podfile内容最后写上下列代码即可:
post_install do |installer|
installer.pod_target_subprojects.each do |project|
project.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '10.0'
end
project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '10.0'
end
end
end
end
今天更新CocoaPods v1.7.0并生成多个Xcodeproj后,在设置这些子Projects、Targets相关配置参数时(post_install操作)遇到的问题,后来通过查看CocoaPods源码installer.rb文件找到了解决方案,只需在Podfile内容最后写上下列代码即可:
post_install do |installer|
installer.pod_target_subprojects.each do |project|
project.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '10.0'
end
project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '10.0'
end
end
end
end
展开
评论
2
#iOS知识小集#「 获取其他App的bundle id的几种方法 」
1.使用PP助手或者老版本的itunes下载相应的app的ipa包,改后缀名解压后,获取info.plist,然后打开查看bundle id
2.在Github上下载iOSAppsInfo这个项目,在真机运行这个项目,可以获取真机上所有App的一些相关信息,bundle id,appVersion等,如图一所示,因为项目中的实现依赖于PrivateApi_LSApplicationWorkspace这个类,在iOS 11以后,这个类失效了,所有只能在iOS 10及以下的真机运行,项目地址
t.cn
3.在Mac上打开控制台应用,连接真机,然后在真机上启动App,便会打印出相关的日志,在输入框中输入"with intent foreground-interactive"对日志进行过滤,可以看到App在冷启动时,SpringBoard进程打印的"Bootstrapping com.tencent.xin with intent foreground-interactive"日志,com.tencent.xin便是微信的bundle id,必须是冷启动才会打印,如图二所示
4.在App Store中搜索相关应用,将其分享到微信,然后使用浏览器打开链接,可以看到网址是这种格式"
t.cn",其中id414478124是微信的app id,根据这个接口
t.cn>可以获取到App相关的一些信息,有一些ASO网站使用这种原理,获取了大量App的信息,做成一个服务平台了,在里面也可以搜索App名字,然后获得bundle id等信息,例如七麦数据,如图三所示,链接
t.cn
1.使用PP助手或者老版本的itunes下载相应的app的ipa包,改后缀名解压后,获取info.plist,然后打开查看bundle id
2.在Github上下载iOSAppsInfo这个项目,在真机运行这个项目,可以获取真机上所有App的一些相关信息,bundle id,appVersion等,如图一所示,因为项目中的实现依赖于PrivateApi_LSApplicationWorkspace这个类,在iOS 11以后,这个类失效了,所有只能在iOS 10及以下的真机运行,项目地址
3.在Mac上打开控制台应用,连接真机,然后在真机上启动App,便会打印出相关的日志,在输入框中输入"with intent foreground-interactive"对日志进行过滤,可以看到App在冷启动时,SpringBoard进程打印的"Bootstrapping com.tencent.xin with intent foreground-interactive"日志,com.tencent.xin便是微信的bundle id,必须是冷启动才会打印,如图二所示
4.在App Store中搜索相关应用,将其分享到微信,然后使用浏览器打开链接,可以看到网址是这种格式"
展开
评论
点赞
赞了这篇沸点
#iOS知识小集#「 如何比较日期是否为同一天 」by @halohily
在产品需求中,某个功能每天例行一次非常常见。比如,某个开关用户当天关掉之后,当天不再展示,直到新的一天第一次启动。再比如,某个功能一天有使用次数上限,直到新的一天第一次启动才恢复额度。一般我们处理这种需求都是在本地存储一个变量来记录最后一次启动的日期,在每次判断功能是否可用时,比较存储的日期和当前最新日期是否同一天。之前处理这个需求的时候,是使用 NSCalendar 对象分别生成两个 NSDate 对象的 NSDateComponents,进而分别比较年、月、日。后来发现,有一个简便的做法是使用同一个 NSDateFormatter 分别生成两个 NSDate 的 NSString,直接比较字符串是否相同即可。
与此相似的还有如何判断一个字符串是否为合法的 NSURL?最正确的办法是使用这个字符串去生成 NSURL 对象,如果返回 nil,这个字符串即为不合法。大多数人面对这个需求很可能会选择繁琐的正则匹配等方式,殊不知转换一下思路,事情会变得非常优雅且简便。
在产品需求中,某个功能每天例行一次非常常见。比如,某个开关用户当天关掉之后,当天不再展示,直到新的一天第一次启动。再比如,某个功能一天有使用次数上限,直到新的一天第一次启动才恢复额度。一般我们处理这种需求都是在本地存储一个变量来记录最后一次启动的日期,在每次判断功能是否可用时,比较存储的日期和当前最新日期是否同一天。之前处理这个需求的时候,是使用 NSCalendar 对象分别生成两个 NSDate 对象的 NSDateComponents,进而分别比较年、月、日。后来发现,有一个简便的做法是使用同一个 NSDateFormatter 分别生成两个 NSDate 的 NSString,直接比较字符串是否相同即可。
与此相似的还有如何判断一个字符串是否为合法的 NSURL?最正确的办法是使用这个字符串去生成 NSURL 对象,如果返回 nil,这个字符串即为不合法。大多数人面对这个需求很可能会选择繁琐的正则匹配等方式,殊不知转换一下思路,事情会变得非常优雅且简便。
展开
2
2