Tag: Anna Domashych

使用TestScheduler测试反应式代码

TL; DR 异步反应性函数,例如Observable.interval() , Observable.timer()或您自己的异步反应性函数,可以通过沿时间轴移动被测对象来使用RxTest.TestScheduler进行测试。 真正忙碌的人可能会立即深入那里的代码: vadimue / RxLocation RxLocation –反应性使用CoreLocation github.com 简单样本 我们都写测试,不是吗? 😏有时我们甚至使用TDD。 通常,我们将Observables用于多个异步操作。 但是用单元测试来测试它们可能很棘手。 如果我们不编写DispatchQueue.main.asyncAfter()或wait(for: [expectation], timeout: 60)异步测试将失败。 否则,我们可能将Rx用于同步操作,这就是为什么我们不会在执行等待时遇到问题。 例如,让我们看一个测试,该测试涵盖了当用户点击单元格时打开带有详细说明的页面。 该测试同步运行,这就是为什么它呈绿色的原因。 与时间有关的要求 有时需要描述测试中与时间相关的要求。 如果您需要测试发送API请求并同时显示UIActivityIndi​​cator怎么办? 还是基于某些延迟下载数据? 测试可能需要一段时间才能运行,因为它们必须等待操作完成。 显然,我们旨在加快运行测试的速度,因为我们经常运行测试并且不想浪费时间。 那么我们应该如何为这些情况编写测试? 我建议从业务需求入手。 假设您创建了一个用于监视用户位置的应用程序: 您可以使用CoreLocation框架; 实现CLLocationManagerDelegate并使之具有响应性(重用来自官方存储库CLLocationManager + Rx.swift和RxCLLocationManagerDelegateProxy.swift的扩展); 使用这些扩展创建单独的服务; 之后获取微小的LocationServiceProtocol的实现。 方法location()返回原始CLLocation对象序列。 在当前的实现中,它们每秒以最简单的配置到达。 那么,需求呢? 位置数据传输应该是周期性的,取决于运行和以下规则: 传输必须至少每分钟执行一次(静止),并且位置变化超过10 m; 传输的频率不应超过每10秒一次。 为了使代码简单(嗨,SRP!),我创建了单独的类,该类将过滤虚拟位置序列。 TrackingService符合该协议: 让我们从描述第一个要求开始: 传输必须每分钟至少执行一次。 要遵循TDD,我们应该首先编写测试。 为此创建并设置XCTestCase类: 时间旅行 现在我们可以编写我们的第一个测试。 这是最终版本。 […]

使用Xamarin.Forms在iOS上过渡动画

Xamarin.Forms允许开发人员立即编写漂亮的移动和桌面应用程序。 可以一次创建组件,一次布局组件,仅一次动画组件! 它的性能和稳定性得到了改善,因此几乎是完美的! 只有很少的棘手的事情真的很难使用此框架来实现。 最需要的一种是页面之间的过渡动​​画。 甚至可以用Xamarin.Forms编写这样的东西吗? 当然! 如果您真的不耐烦,只需从此仓库中获取源代码即可: OlexaLe / BeatleApp 通过在GitHub上创建一个帐户为BeatleApp开发做出贡献。 github.com 在iOS上,默认演示文稿动画看起来像是从当前页面到新页面的从右到左的简单幻灯片 。 不幸的是,我们不能做很多事情。 您可以尝试模仿具有Views的Pages并为它们之间的动画设置过渡,但是您实际上并不需要这样 (相信我,我在那里)。 尽管您可以使用Page的OnAppearing / OnDisappearing 生命周期方法来模拟过渡动画,然后再进行一次-为Pages中的View设置动画。 Xamarin论坛上介绍了此解决方案的实现,但是还有另一种方法- 本机动画 ! 让我们来编写一个应用 让我们从Wikipedia中获取图像和文本,并为披头士乐队的粉丝创建一个简单的应用程序。 它将只有2页。 第一个将包含一个带有音乐家照片和姓名的网格。 第二页将显示所选披头士的简短简介。 您可以从https://github.com/OlexaLe/BeatleApp/tree/master/BeatlesApp-start获取入门项目。 在设备上运行它时,您将看到以下内容: 简单动画 那么如何降低它的标准性呢? 模态和常规导航的行为不同,因此其自定义也不同。 现在让我们专注于常规导航 。 在本机iOS中,您可以通过2个步骤实现自定义过渡动画: 实现采用UIViewControllerAnimatedTransitioning协议的动画对象 采用UINavigationControllerDelegate协议返回动画对象 我们的第一个自定义过渡动画将非常简单。 让我们从导航中删除此从右到左的过渡,并以透明效果在当前上方显示新页面。 为了做到这一点,让我们遵循最初的计划并实现animator对象: Niiii​​ce,但您可以发挥自己的想象力,创建更精彩的动画师类。 例如,让我们添加一个缩放效果! 高级动画 首先,我们需要知道用户点击了哪个图像,因此让我们为图像分配唯一的标识符。 我们可以通过多种方式做到这一点。 正确的方法可能是使用TransitionId字段( 继承或救援的附加属性 )扩展UI组件,但只是为了向您说明模式,我将使用Effect分配UIKit的UIKit的Tag字段。 该应用程序的核心部分几乎没有更改,主要的复杂性仍在动画对象中,但是您可以编写一次,将其包装在库中,然后在其他项目中重用。 结论 在Xamarin.iOS项目中创建复杂的动画很容易,但是正如您在Xamarin中所看到的那样, 窗体的开销确实很大。 […]