小编ors*_*aef的帖子

iOS/Swift:用于连接REST API的良好架构方法

我正在开发iOS应用程序已有很长一段时间了.但最后我对网络层的架构设计从不满意.特别是当它连接API时.


这里可能有重复,但我认为我的问题更具体,你会看到.

构建iOS网络应用程序的最佳架构方法(REST客户端)


我不是在寻找像"使用AFNetworking/Alamofire"这样的答案.无论使用哪个第三方框架,此问题都是如此.

我的意思是,我们经常有这样的情景:

"开发一个使用API​​ Y的应用X"

这主要包括相同的步骤 - 每次.

  1. 实施登录/注册
  2. 您获得了身份验证令牌,必须将其保存在钥匙串中并将其附加到每个API调用中
  3. 您必须重新验证并重新发送401失败的API请求
  4. 您有错误代码要处理(如何集中处理它们?)
  5. 您实现了不同的API调用.

3)的一个问题

在Obj-C中,我用NSProxy它在发送之前拦截每个API调用,如果令牌过期则重新验证用户,并触发实际请求.在Swift中NSOperationQueue,如果我们得到一个401并且在成功刷新后将实际请求排队,我们就有一些我们排队的auth调用.但这限制了我们使用Singleton(我不太喜欢),我们还必须将并发请求限制为1.我更喜欢第二种方法 - 但是有更好的解决方案吗?

关于4)

你如何处理http状态代码?每个错误都使用许多不同的类吗?您是否将一般错误处理集中在一个类中?您是在同一级别处理它们还是更早地捕获服务器错误?(也许在你的任何第三方lib的API Wrapper中)


你是如何开发人员试图解决这个问题的?你有没有找到"最佳匹配"的设计?你如何测试你的API?特别是你如何在Swift中做到这一点(没有真正的嘲弄可能性?).

当然:每个用例,每个应用程序,每个场景都是不同的 - 没有"一个解决方案适合所有人".但我认为这些一般问题经常出现,所以我很想说"是的,对于这些情况 - 可能有一个或多个解决方案 - 你可以每次都重复使用".

期待有趣的答案!

干杯
奥兰多

architecture rest networking ios swift

12
推荐指数
1
解决办法
1842
查看次数

CoreBluetooth:如何为许多特性设计代码(30 - 40)?

我搜索了一下,发现这可能是一个重复的问题:

多个CBPeripheral用于同一设备

我的问题是:

我有多个服务,它们共有大约30-40个特征(是的,我需要所有这些...).作为处理CoreBluetooth的起点,我总是使用Apple示例代码(CoreBluetooth温度传感器).

发现和服务/特征处理分为两类,这只适用于几个特征.但是在一个类中处理这么多的特性并不是我在"良好的软件设计"中所理解的.

进入脑海的第一个想法是为每个服务创建一个类.但不幸的是,CBPeripheral只能同时拥有一个CBPeripheralDelegate.这意味着我不能把它分成几个类.

(如果BLE是获取此类数据的正确技术,我们不必开始讨论 - 事实并非如此.但是有些制造商使用BLE,因此他们不必为MFi计划烦恼......)

我还阅读了最终提供的CoreBluetooth编程指南,但它只描述了基本的工作流程 - 没有关于正确的设计.

我正在寻找一个很好的设计方法.您可能有任何建议,提示或示例代码链接?提前谢谢了!

architecture software-design ios core-bluetooth cbperipheral

10
推荐指数
1
解决办法
2160
查看次数

在 SwiftUI 中使用 ForEach 插入、更新和删除动画

我设法为 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)

foreach animation listview swift swiftui

9
推荐指数
1
解决办法
3745
查看次数

TabView 选择重置为工作表演示文稿上的第一个选项卡

更新:

感谢 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)

ios tabview swift swiftui

7
推荐指数
1
解决办法
1602
查看次数

在Safari中打开其他网站的WKWebView链接

我有一个带有wkwebview的应用程序。我需要帮助的是,当用户单击Web视图内的链接时,它会在Safari中打开。但是,如果他们单击具有相同域的链接,则会在Web视图中打开该链接。

例如。如果Webview打开apple.com,并且用户单击打开apple.com/iphone的链接,我希望它在Webview内部打开。但是,如果他们单击打开google.com的链接,我希望它在野生动物园应用程序中打开。您能给我一些代码以便我实现吗?

(这是使用Swift 3的iOS应用)

safari webview ios swift wkwebview

1
推荐指数
1
解决办法
1334
查看次数