我正在开发iOS应用程序已有很长一段时间了.但最后我对网络层的架构设计从不满意.特别是当它连接API时.
这里可能有重复,但我认为我的问题更具体,你会看到.
我不是在寻找像"使用AFNetworking/Alamofire"这样的答案.无论使用哪个第三方框架,此问题都是如此.
我的意思是,我们经常有这样的情景:
"开发一个使用API Y的应用X"
这主要包括相同的步骤 - 每次.
3)的一个问题
在Obj-C中,我用NSProxy它在发送之前拦截每个API调用,如果令牌过期则重新验证用户,并触发实际请求.在Swift中NSOperationQueue,如果我们得到一个401并且在成功刷新后将实际请求排队,我们就有一些我们排队的auth调用.但这限制了我们使用Singleton(我不太喜欢),我们还必须将并发请求限制为1.我更喜欢第二种方法 - 但是有更好的解决方案吗?
关于4)
你如何处理http状态代码?每个错误都使用许多不同的类吗?您是否将一般错误处理集中在一个类中?您是在同一级别处理它们还是更早地捕获服务器错误?(也许在你的任何第三方lib的API Wrapper中)
你是如何开发人员试图解决这个问题的?你有没有找到"最佳匹配"的设计?你如何测试你的API?特别是你如何在Swift中做到这一点(没有真正的嘲弄可能性?).
当然:每个用例,每个应用程序,每个场景都是不同的 - 没有"一个解决方案适合所有人".但我认为这些一般问题经常出现,所以我很想说"是的,对于这些情况 - 可能有一个或多个解决方案 - 你可以每次都重复使用".
期待有趣的答案!
干杯
奥兰多
我搜索了一下,发现这可能是一个重复的问题:
我的问题是:
我有多个服务,它们共有大约30-40个特征(是的,我需要所有这些...).作为处理CoreBluetooth的起点,我总是使用Apple示例代码(CoreBluetooth温度传感器).
发现和服务/特征处理分为两类,这只适用于几个特征.但是在一个类中处理这么多的特性并不是我在"良好的软件设计"中所理解的.
进入脑海的第一个想法是为每个服务创建一个类.但不幸的是,CBPeripheral只能同时拥有一个CBPeripheralDelegate.这意味着我不能把它分成几个类.
(如果BLE是获取此类数据的正确技术,我们不必开始讨论 - 事实并非如此.但是有些制造商使用BLE,因此他们不必为MFi计划烦恼......)
我还阅读了最终提供的CoreBluetooth编程指南,但它只描述了基本的工作流程 - 没有关于正确的设计.
我正在寻找一个很好的设计方法.您可能有任何建议,提示或示例代码链接?提前谢谢了!
architecture software-design ios core-bluetooth cbperipheral
我设法为 a 中显示的项目制作了一个很好的插入和删除动画ForEach(通过.transition(...)on完成Row)。但遗憾的是,当我只是更新Item观察到的数组中的名称时,也会触发此动画。当然这是因为它实际上是一个新视图(您可以看到,因为调用了onAppear()of Row)。
众所周知,推荐的管理带有酷动画的列表的方法是,List但我认为许多人希望避免标准 UI 或此元素带来的限制。
附加了一个有效的 SwiftUI示例片段(使用 Xcode 11.4 构建)
所以,问题:
是否有一种聪明的方法可以为保持相同位置的更新项目抑制动画(或有另一个)?是否有一种很酷的可能性来“重用”该行并对其进行更新?
或者答案是“让我们等待下一个 WWDC,让我们看看 Apple 是否会修复它......”?;-)
干杯,
奥兰多
编辑
当您可以区分编辑/添加/删除(例如,通过手动用户操作)时,笨拙的前辈答案实际上是一种很好的方法。一旦items数组在后台更新(例如通过来自视图模型中的 Core Data 的同步更新),您不知道这是否是更新。但也许在这种情况下,答案是在视图模型中手动实现插入/更新/删除情况。
struct ContentView: View {
@State var items: [Item] = [
Item(name: "Tim"),
Item(name: "Steve"),
Item(name: "Bill")
]
var body: some View {
NavigationView {
ScrollView {
VStack {
ForEach(items, id: \.self) { item in
Row(name: item.name)
} …Run Code Online (Sandbox Code Playgroud) 感谢 Harshil 和 Sumit 指出我太愚蠢了,没有意识到我正在使用id()而不是tag(). 如果说你能从这个问题中学到什么,那就是:
当你独自完成一个项目时,你往往会变得盲目。你看不到自己的错误。进行代码审查。请朋友和同事查看一下。这是个好主意。;)
在我的 SwiftUI 项目中,我使用BindingTabView来$selection以编程方式切换选项卡。
问题是:例如,当我在上呈现工作表时,TabView选择中包含的第二个视图将重置为第一个选项卡。
对我来说,这似乎是一个SwiftUI 错误- 但有解决方法吗?
下面您可以找到一个演示该行为的工作示例。(使用Xcode 12.4测试)
如何测试:转到第二个选项卡,点击“二”按钮,您将看到返回到第一个选项卡。一旦您selection从 TabView 中删除该属性,这种情况就不会再发生。
奥兰多干杯
enum TabPosition: Hashable {
case one
case two
case three
}
struct RootView: View {
@State private var selection: TabPosition = .one
var body: some View {
TabView(selection: $selection) {
One()
.tabItem { Label("One", systemImage: "1.circle") }
.id(TabPosition.one) …Run Code Online (Sandbox Code Playgroud) 我有一个带有wkwebview的应用程序。我需要帮助的是,当用户单击Web视图内的链接时,它会在Safari中打开。但是,如果他们单击具有相同域的链接,则会在Web视图中打开该链接。
例如。如果Webview打开apple.com,并且用户单击打开apple.com/iphone的链接,我希望它在Webview内部打开。但是,如果他们单击打开google.com的链接,我希望它在野生动物园应用程序中打开。您能给我一些代码以便我实现吗?
(这是使用Swift 3的iOS应用)
ios ×4
swift ×4
architecture ×2
swiftui ×2
animation ×1
cbperipheral ×1
foreach ×1
listview ×1
networking ×1
rest ×1
safari ×1
tabview ×1
webview ×1
wkwebview ×1