国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

聊聊 Swift 中的熱重載

移動開發(fā) iOS
如果您只需要做一次的話,聽起來還不錯。但是如果您和我一樣,在特別的一天中,對代碼庫進行 200 - 500 次迭代,該怎么辦呢?它增加了。

?前言

這一年是2040年,我們最新的 MacBook M30X 處理器可以感知到瞬間編譯大型 Swift 項目,聽起來很神奇,對吧?除此之外,編譯代碼庫只是我們迭代周期的一部分。包括:

  • 重新啟動它(或?qū)⑵洳渴鸬皆O備)
  • 導航到您在應用程序中的先前位置
  • 重新生成您需要的數(shù)據(jù)。

如果您只需要做一次的話,聽起來還不錯。但是如果您和我一樣,在特別的一天中,對代碼庫進行 200 - 500 次迭代,該怎么辦呢?它增加了。

有一種更好的方法,被其他平臺所接受,并且可以在 Swift/iOS 生態(tài)系統(tǒng)中實現(xiàn)。我已經(jīng)用了十多年了。

從今天開始,您想每周節(jié)省多達 10 小時的工作時間嗎?

熱重載

熱重載是關(guān)于擺脫編譯整個應用程序并盡可能避免部署/重新啟動周期,同時允許您編輯正在運行的應用程序代碼并且能立即看到更改。

這種流程改進可以每天為您節(jié)省數(shù)小時的開發(fā)時間。我跟蹤我的工作一個多月,對我來說,每天節(jié)省了 1-2 小時。

坦白地說,如果每周節(jié)省10個小時的開發(fā)時間都不能說服您去嘗試,那么我認為任何方法都不能說服你。

其他平臺在做什么?

如果您只使用 Apple 平臺,您會驚訝地發(fā)現(xiàn)有好多平臺幾十年前已經(jīng)采用了熱重載。無論您是編寫 Node 還是任何其他 JS 框架,都有一個使用熱重載的設置。Go 也提供了熱重載(本博客使用了該特性)

另一個例子是谷歌的 Flutter 架構(gòu),從一開始就設計用于熱重載。如果您與從事 Flutter 工作的工程師交談,你會發(fā)現(xiàn)他們最喜歡 Flutter 開發(fā)者體驗的一點就是能夠?qū)崟r編寫他們的應用程序。當我為《紐約時報》寫了一個拼字游戲時,我很喜歡它。

微軟最近推出了 Visual Studio 2022,并為 .NET 和 標準 C++ 應用程序提供熱重載,在過去的十年中,微軟在開發(fā)工具和經(jīng)驗方面一直在大殺四方,所以這并不令人驚訝。

蘋果生態(tài)系統(tǒng)怎么樣?

早在 2014 年推出時,很多人都對 Swift Playgrounds 感到敬畏,因為它們允許我們快速迭代并查看代碼的結(jié)果,但它們并不能很好地工作,因為它存在崩潰、掛起等問題。不能支持整個iPad環(huán)境。

在它們發(fā)布后不久,我啟動了一個名為 Objective-C Playgrounds 的開源項目,它比官方 Playgrounds 運行得更快、更可靠。我的想法是設計一個架構(gòu)/工作流程,利用我已經(jīng)使用了幾年的 DyCI 代碼注入工具,該工具已經(jīng)由 Paul 制作。

自從 Swift Playgrounds 存在以來,已經(jīng)過去了八年,而且它們變得更好了,但它們可靠嗎?人們是否在使用它們來推動開發(fā)?

以我的經(jīng)驗:并非如此。Playgrounds 在大型項目中往往不太可靠或適用。

SwiftUI 出現(xiàn)了,它是一項了不起的技術(shù)(盡管仍然存在錯誤),它引入了與 Playgrounds 非常相似的 Swift Previews 的想法,它們有什么好處嗎?

類似的故事,當它工作的時候是很好的,但是在更大的項目中,它的工作是不可靠的,而且往往中斷的次數(shù)比它們工作的次數(shù)多。如果你有任何錯誤,他們不會為你提供調(diào)試代碼的能力,因此,采用的情況有限。

我們需要等待 Apple 嗎?

如果你關(guān)注我一段時間,你就已經(jīng)知道答案了,絕對不要。畢竟,我的職業(yè)生涯是構(gòu)建普通 Apple 解決方案無法解決的問題:從像 Sourcery 這樣的語言擴展、像 Sourcery Pro 這樣的 Xcode 改進,再到 LifetimeTracker 以及許多其他開源工具。

我們可以利用我最初在 2014 Playgrounds 中使用的相同方法。我已經(jīng)使用它十多年了,并且在數(shù)十個 Swift 項目中使用它并取得了巨大的成功!

許多年前,我從使用  DyCI[1] 切換到 InjectionForXcode,通過利用 LLVM 互操作而不是任何 swizzling ,它的效果更好。它是一個完全免費的開源工具,您可以在菜單欄中運行,它是由多產(chǎn)的工程師 John Holdsworth 創(chuàng)建的。你應該看看他的書 Swift Secrets[2]。

我意識到 Playgrounds 的方法可能過于笨重,所以今天,我開源了。一個非常專注的名為 Inject 的微型庫,與 InjectionForXcode 搭配使用時,將使您的 Apple 開發(fā)更加高效和愉快!

但不要只相信我的話。看看 Alexandra 和 Nate 的反饋,在我將這個工作流程引入  The Browser Company 設置之前,他們已經(jīng)非常精通了,這使得它更加令人印象深刻。

圖片

Inject

這個小型庫是完全通用的,無論您使用 UIKit?、 AppKit? 還是 SwiftUI,您都可以使用它。

您無需為生產(chǎn)應用程序添加條件或刪除 Inject 代碼。它變成了無操作內(nèi)聯(lián)代碼,將在非調(diào)試版本中被編譯過程剝離。您可以在每個視圖中集成一次,并持續(xù)使用數(shù)年。

請參考 GitHub repo[3] 中關(guān)于配置項目的說明。現(xiàn)在讓我們來看看您有哪些工作流程選項。

工作流

SwiftUI

只需要兩行字就可以使任何 SwiftUI 啟用實時編程,而當您這樣做時,您將擁有比使用 Swift Previews 更快的工作流程,同時能夠使用實際的生產(chǎn)數(shù)據(jù)。

這是我的 Sourcery Pro[4] 應用程序的示例,其中加載了我所有的實際數(shù)據(jù)和邏輯,使我能夠即時快速迭代整個應用程序設計,而無需任何重新啟動、重新加載或類似的事情。

看看這個開發(fā)工作流程有多快吧,告訴我你寧愿在我每次接觸代碼時等待Xcode的重新構(gòu)建和重新部署。

UIKit / AppKit

我們需要一種方法來清理標準命令式UI框架的代碼注入階段之間的狀態(tài)。

我創(chuàng)建了 Host 的概念并且在這種情況下工作的很好。有兩個:

- Inject.ViewHost
- Inject.ViewControllerHost

我們?nèi)绾渭伤课覀儼盐覀兿氲念惏b在父級,因此我們不修改要注入的類型,而是改變父級的調(diào)用站點。

例如,如果你有一個 SplitViewController ,它創(chuàng)建了 PaneA 和 PaneB ,而你想在PaneA 中迭代布局/邏輯代碼,你就修改 SplitViewController 中的調(diào)用站點。

paneA = Inject.ViewHost(
PaneAView(whatever: arguments, you: want)
)

這就是你需要做的所有改變。注入現(xiàn)在允許你更改 PaneAView 中的任何東西,除了它的初始化API。這些變化將立即反映在你的應用程序中。

一個更具體的例子?

  • 我下載了 Covid19 App
  • 添加 -Xlinker -interposable 到 Other Linker Flags
  • 交換了一行 Covid19TabController.swift:L63 行

從這句:

let vc = TwitterViewController(title: Tab.twitter.name, usernames: Twitter.content)

替換為:

let vc = Inject.ViewControllerHost(TwitterViewController(title: Tab.twitter.name, usernames: Twitter.content))

現(xiàn)在,我可以在不重新啟動應用程序的情況下迭代控制器設計。

這是如何運作的呢?

Hosts 利用了自動閉包,因此每次您注入代碼時,我們都會使用與最初相同的參數(shù)創(chuàng)建您類型的新實例,從而允許您迭代任何代碼、內(nèi)存布局和其他所有內(nèi)容。你唯一不能改變的是你的初始化 API。

Host 的變化不能完全內(nèi)聯(lián),所以這些類在 Release 構(gòu)建中被刪除。最簡單的方法是做一個單獨的提交,交換此單行代碼,然后在工作流程的最后刪除它。

邏輯注入如何呢?

像 MVVM / MVC 這樣的標準架構(gòu)可以獲得免費的邏輯注入,重新編譯你的類,當方法重新執(zhí)行時,你已經(jīng)在使用新代碼了。

如果像我一樣,你喜歡 PointFree Composable Architecture[5],你可能想要注入 reducer 代碼。Vanilla TCA 不允許這樣做,因為 reducer 代碼是一個免費功能,不能直接用注入替換,但我們在 The Browser Company 的分支 支持它。

當我最初開始咨詢 TBC 時,我想要的第一件事是將 Inject? 和 XcodeInjection 集成到我們的工作流程中。公司管理層非常支持。

如果您切換到我們的 TCA 分支(我們保持最新),你可以在 UI 和 TCA 層上使用 Inject 。

它有多可靠?

沒有什么是完美的,但我已經(jīng)使用它十多年了。它比 Apple 技術(shù)(Playgrounds / Previews)可靠得多。

如果您投入時間學習它,它將為您和您的團隊節(jié)省數(shù)千小時!

參考資料

[1] DyCI: https://github.com/DyCI/dyci-main

[2] Swift Secrets: http://books.apple.com/us/book/id1551005489

[3] GitHub repo: https://github.com/krzysztofzablocki/Inject

[4] Sourcery Pro: http://merowing.info/sourcery-pro/

[5] PointFree Composable Architecture: https://github.com/pointfreeco/swift-composable-architecture

[6] Demo 源碼: https://github.com/krzysztofzablocki/Inject

責任編輯:武曉燕 來源: Swift社區(qū)
相關(guān)推薦

2022-05-11 09:01:54

Swift類型系統(tǒng)幻象類型

2022-05-25 09:15:01

Swift 5.6占位符

2021-07-07 11:41:38

Swift key paths

2022-06-13 09:02:06

Swift類型占位符

2021-04-19 10:45:52

Webpack熱更新前端

2021-09-15 16:41:20

京東零售云Flutter熱重載

2022-04-13 21:07:30

Vue 3函數(shù)重載

2021-08-31 07:54:24

SQLDblink查詢

2024-04-26 00:00:00

Rust檢查器代碼

2023-11-09 11:56:28

MySQL死鎖

2021-11-17 08:11:35

MySQL

2022-02-28 08:17:24

重載函數(shù)JS前端

2023-08-29 09:46:12

SQLCTE遞歸

2021-12-11 19:00:54

Java中斷機制

2021-08-16 06:56:21

Slice數(shù)組類型內(nèi)存

2022-04-02 08:14:02

JavaThreadLoca數(shù)據(jù)

2021-11-09 06:55:03

SQLServer排序

2023-04-14 15:44:20

TypeScrip函數(shù)重載

2021-03-08 00:11:02

Spring注解開發(fā)

2023-07-28 09:54:14

SQL數(shù)據(jù)Excel
點贊
收藏

51CTO技術(shù)棧公眾號

成人在线观看免费网站| 欧美国产精品| 亚洲成人免费电影| 免费看黄在线看| 免费视频一区三区| 亚洲精品在线免费播放| 黄网免费视频| 国产馆精品极品| 国产精品久久久久久久免费大片 | 国产日韩三级| 亚洲成**性毛茸茸| 牛牛澡牛牛爽一区二区| 久久久精品免费网站| 视频在线精品一区| 在线电影一区二区| 国产精品狠色婷| 久久综合给合| 国产亚洲精品久久久久久| 婷婷免费在线视频| 在线亚洲一区观看| 中文在线视频| 欧美日韩国产丝袜美女| 国产男小鲜肉同志免费| 中文字幕精品一区| 网站一区二区三区| 91蜜桃在线免费视频| 日韩一级免费看| 国产精品自拍三区| 国产免费xxx| 久久精品999| 中文字幕成人一区| 奇米在线7777在线精品| 欧美污视频久久久| 亚洲欧美春色| 欧美日韩大片一区二区三区| 国产精品videosex极品| 亚洲最大成人在线| 午夜久久美女| 国产九色精品| 亚洲一区二区三区高清| 久久国产精品精品国产色婷婷| 欧美视频在线观看| 韩国成人av| 久久一区国产| 麻豆中文字幕在线观看| 狠狠色狠狠色综合| 大陆av在线播放| 久久婷婷综合激情| 狠狠操第一页| 精品久久久中文| 午夜视频在线看| 亚洲电影免费观看高清完整版在线观看| bestiality新另类大全| 亚洲精品电影网| 日韩免费小视频| 欧美国产在线视频| 国产探花在线精品| 国产精品一区视频网站| 视频一区中文字幕国产| 日本xxxxx18| 久久精品视频免费观看| 快播av资源| 在线电影一区二区三区| 91jq激情在线观看| 插插插亚洲综合网| 狠狠综合久久av一区二区蜜桃| 99高清视频有精品视频| 玖玖玖国产精品| 国自产拍偷拍精品啪啪一区二区| 91久色porny| 中文视频在线| 日韩精品中文字幕在线一区| 性欧美18一19sex性欧美| 蜜臀久久99精品久久久无需会员| 台湾色综合娱乐中文网| 国产高清自拍99| 国产馆精品极品| 免费国产视频| 精品久久久网站| 免费精品一区二区三区在线观看| 国产精品国产三级国产专播精品人| 一本色道久久精品| 青青在线视频观看| 好吊成人免视频| 日本精品另类| 成人国产精品日本在线| 蜜臀久久久久久久| 亚洲最大成人在线观看| 欧美在线视频日韩| 国产精品字幕| 91视频国产一区| 高清久久久久久| 亚洲男人都懂的网站| 亚洲日韩中文字幕在线播放| 综合伊思人在钱三区| 日韩中文字幕一区| 亚洲精选在线视频| 91av亚洲| av一本久道久久波多野结衣| av综合在线播放| 日本中文字幕在线播放| 久久久久五月天| 久久久噜噜噜| a4yy在线播放免费观看视频| 亚洲摸下面视频| 亚洲成人一区| 欧美精品无码一区二区三区| 欧美猛男男办公室激情| 欧美大奶一区二区| 久久这里只有精品18| 欧美综合天天夜夜久久| 国产精品巨作av| 国产在线无码精品| 欧洲人成人精品| 三级精品视频| 欧美极品少妇无套实战| 欧美午夜片在线看| 国产精品美女久久久久久不卡| 免费的av在线| 欧美美女喷水视频| 97精品国产| jizzjizzjizz亚洲女| 一区二区av在线| 日韩av中文在线观看| 久久精品色图| 国产精品va在线播放| 91麻豆高清视频| 精品3atv在线视频| 亚洲精品国产一区| 欧美三级蜜桃2在线观看| 蜜乳av综合| 色总=综合色| 蜜月aⅴ免费一区二区三区| 久久成人久久鬼色| www.欧美日本韩国| 精品久久久久久一区| 黄色成人在线免费| 一道本一区二区三区| 男人的天堂99| 国产一区二区黄| 蜜桃视频在线观看一区| 国产区av在线| 91夜夜未满十八勿入爽爽影院| 欧美激情一区二区三区| www.久久爱.com| 中国丰满人妻videoshd| 亚洲天堂av网| 国产一区二区三区免费播放| 色呦呦网站在线观看| 鲁鲁视频www一区二区| 欧美性猛片aaaaaaa做受| 在线国产一区| 黄色片视频在线观看| 成人免费xxxxx在线观看| 亚洲一区二区三区激情| 国产最新精品| 在线一二三区| 91在线中文字幕| 色噜噜久久综合| 欧美精品一卡| 麻豆av免费在线观看| 欧美日韩精品免费观看视一区二区| 欧美精品久久99久久在免费线| 亚洲精品美女| 麻豆蜜桃在线| 日本wwwcom| 欧美第一淫aaasss性| 国产精品久久久久久久浪潮网站| 久久91在线| 性欧美精品孕妇| 精品国产二区在线| 精品成人一区二区| 丁香六月综合激情| 成功精品影院| 免费在线观看麻豆视频| 成人黄色片视频网站| 欧美乱妇20p| 日韩av一区二区三区四区| 性欧美18xxxhd| 免费高清在线观看免费| 97精品欧美一区二区三区| 亚洲国产精品视频| 国产一区二区精品| 欧美aaa视频| 少妇一级淫免费播放| 国产精品成人aaaaa网站| 欧美午夜精品伦理| 蜜桃视频一区二区| 91视频亚洲| 自拍av在线| 中文字幕乱码一区二区三区| 日韩中文在线中文网在线观看| 国产精品毛片久久久久久| 中文字幕免费精品| ririsao久久精品一区| 熟妇人妻无乱码中文字幕真矢织江| 日本午夜精品理论片a级appf发布| 欧美这里有精品| 成人免费高清视频| 一区二区三区四区在线观看国产日韩|