- 博客(15)
- 收藏
- 关注
原创 第二章 Publisher 和 Subscriber (Part. 1)
Publiser简介Combine 的核心是发布者协议。该协议定义了一种类型的要求,以便能够随时间向一个或多个订阅者传输一系列值。换句话说,你可以将感兴趣的值,用发布者将其用事件的方式发布出去。发布者可以发出零个或多个值,但只能发出一个完成事件,可以是正常的完成事件,也可以是错误。一旦发布者发出完成事件,它就完成了,不能再发出任何事件。在实际应用中,我们用Publishers来启动我们Combine流程,也可以称为Combine链,试想下你如果想观察一个数据的变化,那么我们要把数据放到Co
2021-10-13 16:59:28 954
原创 第一章 Hello Combine
用 Apple 自己的话来说:“Combine 框架为您的应用程序如何处理事件提供了一种声明性方法。您可以为给定的事件源创建一个处理链,而不是潜在地实现多个委托回调或完成处理程序闭包。链的每个部分是一个组合运算符,它对从上一步接收到的元素执行不同的操作。”这段话初学者必定是无法理解,需要真正使用过Combine后回来看才能有所收获。我们可以这样理解:异步数据,所需要的操作,无非是`发送`、`接收`和`处理`,那么Combine就是实现这些过程的框架。发送就是下文中的发布者(Publishe...
2021-10-13 16:44:23 281
原创 在SwiftUI中使用Combine·序
最近在学习raywenderlich.com几位大神联合写作的一本《Combine Asynchronous Programming with Swift》第二版,领悟很多。学习中通过翻译原著和自己编写示例代码来加深理解,在此将学习心得分享给各位。后续文章基本已翻译原书为主,原书中讲解已经很详细,但还有些个人觉得需要注意的点,我都加入文章中作为我自己的理解,同时原书中有些示例代码不好理解,我也替换为我自己写的一些能简单理解的代码。目前使用的XCode为12.5.1,SwiftUI 2.0。...
2021-10-13 16:33:45 353
原创 Combine操作符append和prepend
swift标准库中有append函数,可以在数组或字符串后添加一个相同类型的数据,比如var str = "Hello"str.append(" world!")// OutputHello world!在Combi个ine中,也可以使用append来给Publisher在后面增加一个Output,或者增加一个Publisher,同时,Combine还提供了一个prepend操作符,和append相反,他是在前面增加一个Output,或是publisherprepend Output
2021-10-04 21:33:26 639
原创 SwiftUI Combine的Future
Future在苹果官方文档的解释为:最终发布一个数据并立即结束。这个解释过于简单了,其实Future的作用是:我将在未来的某一时刻,发布一个数据,并伴随着成功或失败的状态。这个功能你可能听起来比较耳熟,对,他就是逃逸闭包(@escaping closure)的功能。查看Future的源代码,我们可以看到final public class Future<Output, Failure> : Publisher where Failure : Error { /// A
2021-09-20 16:21:04 483
原创 SwiftUI Combine的CurrentValueSubject
先说结论,CurrentValueSubject适合那些有初始状态的数据。CurrentValueSubject介绍和PassthroughSubject相比,CurrentValueSubject在声明时候需要有一个初始值在playground中输入以下代码let curPublisher = CurrentValueSubject<String, Never>("No.1")我们声明了一个发布字符串的publisher,初始值发布“No.1”。接着我们来订阅这个pu
2021-09-19 20:45:38 588
原创 SwiftUI Combine 的 PassthroughSubject
PassthroughSubject,本质是把一个数据,变为Publisher以一个数组publisher为例let fibonacciPublisher = [0,1,1,2,3,5].publisher查看fibonacciPublisher(option+鼠标点击),他是Publishers.Sequence<[Int], Never>的类型,是将Sequence转换后的publisher,我们可以用sink的方法,订阅并接收他发布的数据fibonacciPublish
2021-09-19 12:42:20 446
原创 SwiftUI+Combine实现简单搜索功能
XCode 12.5.1 SwiftUI 2.0首先创建一个简单的View和ViewModel// MARK:- Viewstruct ContentView: View { @StateObject var vm = ViewModel() var body: some View { NavigationView { VStack { TextField("Search...",text
2021-09-18 14:01:56 652
原创 SwiftUI Combine学习记录(一)
几个月前开始学习Combine,看了不少视频和文章,也做了几个使用Combine的demo,如用户名密码检验、搜索栏等,但总是感觉无法真正领会Combine的精髓。在此做些学习的记录,争取可以全面的掌握这门swiftui的核心框架。Combine在官方文档,Combine的定义为:“通过组合事件处理运算符自定义异步事件的处理。”Combine 框架提供了一个声明性的 Swift API,用于随着时间的推移处理值。这些值可以表示多种异步事件。 Combine 声明发布者公开可随时间变化的值,订阅者
2021-09-15 21:16:30 910
原创 SwiftUI在MVVM模式中使用CoreData
XCode 12.5.1 SwiftUI MacOS 11.5.1SwiftUI的推荐设计模式是MVVM模式,即Model-ViewModel-View,Model和View相对来说比较简单,一个是数据结构的声明,一个是View的表现。ViewModel则复杂一些,除了处理数据逻辑,刷新View需要的@Published数据外,还需要在ViewModel中细分其他的层次结构,如网络数据层、用户数据层,和我们今天用到的CoreData数据层。新建一个Xcode swiftui工程后,首先新建一个Dat
2021-09-13 11:28:56 964
原创 SwiftUI + RealityKit 实现简单AR测距
Xcode 12.5.1 SwiftUI ARKit RealityKit MacOS 11.5.1本demo只是为了学习realitykit的使用,实际如果制作AR测距,推荐使用SceneKit来描绘点和线与文字。效果如图SwiftUI+RealityKit实现简单AR测距首先在Xcode新建一个工程,选择Augmented Reality App.建好之后,会有默认的一个3d模型文件和一段默认的ARViewContainer的代码,运行后,当屏幕中心点找到水平面后,会显示一个立方体模型
2021-09-11 12:37:20 1748
原创 SwiftUI 在滚动视图中创建可拉伸的顶部图片
xcode 12.5.1、SwiftUI、MacOS 11.5.1实现效果如下:核心思想就是,获取ScrollView的下拉偏移,让图片的高度变为原图片高度+偏移量在本测试demo中,顶部图片视图和列表视图,都放在ScrollView中,为获得ScrollView的下拉偏移,需要用GeometryReader来包裹顶部图片视图,来获得父视图ScrollView的位置和大小 ScrollView { GeometryReader { geometry in.
2021-09-11 12:00:03 592
原创 SwiftUI的多列列表
尝试手动实现一个SwiftUI的多列列表,效果如下:在列表的标题滚动到顶部时,显示对应的标题内容,并固定,实现此方法需要用到preference 首选项功能。关于preference,可以参阅这篇文章The magic of view preferences in SwiftUI简单来说,preference允许我们将子视图的属性,传递给父视图。在这个例子中,我们将标题栏的位置和大小,传递给父视图,由父视图来判断当前需要显示哪个标题栏首先定义一个preferenceKeyst...
2021-08-30 16:42:58 1033
原创 SwiftUI List中的TextField
开发环境:XCode 12.5.1 、MacOS 11.5.1、IOS 14.0实际开发过程中,会有用List包裹一些TextFiled的情况,我们可以写如下代码实现:struct ListAndTextField: View { @State var players = ["Todi", "Messi", "Nimar"] var body: some View { VStack { List(0..<players.co
2021-08-27 00:35:11 243
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人