背景:
我需要开始我们希望长期维护的项目(基本上是可重用的组件,将在多个项目中重用)。我正在探索响应式编程,而响应式编程带来的好处是忽略它的方式。
我开始探索各种可用的 FRP 框架,RxSwift、ReactiveCocoa 就是这样的几个例子。但考虑到社区支持和快速实现,RxSwift 显然是最佳选择。
现在 RxSwift4 带来了一些重大变化,因为 RxSwift3 与 Swift4 不兼容。现在社区在顺利地弥合变化方面做得很好,但是像 RxSwift3 中实现的 DelegateProxy 这样的东西开始在 RxSwift4 中被破坏。因此,对于那些使用 RxSwift3 的人来说,这不仅仅是一个 pod 更新,还涉及大量更改。在关注 RxSwift Git hub issue意识到是因为 Swift4 的变化导致了这个中断。
问题:
现在我们承担使用所有第三方框架的一个非常普遍的风险,但是对于我使用的大多数框架,如果它们崩溃了,它们会破坏应用程序中的一两个功能,但是如果我在 RxSwift 中编写一个完整的应用程序并且 future 的更新中断,找到一个可替换的库并替换它将是一项巨大的工作。
这是为什么?
例如,如果您使用 Alamofire,通常您会在应用程序中拥有自己的网络层,这会将某些 API 公开给应用程序,坦率地说,应用程序不会担心幕后使用的库。所以更换它是一件很容易的事。但是对于 RxSwift,所有异步工具,如 delegates、blocks、notifications 都已经包装在 RxSwift 组件中,如 Observables、Subjects,Units 等我们无法编写自己的包装器,如果当前的 RxSwift 版本在未来的更新中中断,我们将别无选择,只能直接修复它们一个,因为替换库意味着完全重新编写项目。
我知道这是一种基于意见的问题,但问题是网络上没有太多针对相同问题的指导意见。如果有人在他们的项目中使用 FRP 框架并发布使用它们的最佳实践,以便最大限度地减少对框架的依赖,并允许我们在未来轻松转移到新的 FRP 框架,我将不胜感激。
编辑:
上面提到 Alamofire 只是为了展示包装我们仅在应用程序中使用的其他框架是多么容易,与 RxSwift 本身无关。所以请不要被那个冲昏了头脑:)
最佳答案
我基于意见的简短回答是,从 Swift3 开始就足够安全了,因为从 Swift3 开始就保证了向后兼容性。我广泛使用 RxSwift 和一系列衍生框架(RxCoreData、RxCloudKit、RxGesture、RxCoreMotion 和 RaspSwift)大约一年了,从来没有遇到过特别麻烦的事情。但话又说回来,你提到了一些我没有使用的框架,它们带来了兼容性问题。因此,显然可能会出现令人不快的意外,而这些意外通常会被开源社区足够快地修复。
关于ios - 知道 swift 不断变化,将第三方 FRP 框架用于长期运行的项目有多安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47323576/
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit
在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?
在启用Rack::Deflater来gzip我的响应主体时偶然发现了一些奇怪的东西。也许我遗漏了一些东西,但启用此功能后,响应被压缩,但是资源的ETag在每个请求上都会发生变化。这会强制应用程序每次都响应,而不是发送304。这在没有启用Rack::Deflater的情况下有效,我已经验证页面源没有改变。我正在运行一个使用thin作为Web服务器的Rails应用程序。Gemfile.lockhttps://gist.github.com/2510816有没有什么方法可以让我从Rack中间件获得更多的输出,这样我就可以看到发生了什么?提前致谢。 最佳答案
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里