小编Ric*_*zio的帖子

发布者完成后从 AnyCancellable 数组中删除

有没有一种好方法来处理完成/取消时AnyCancellable删除存储的数组AnyCancellable

说我有这个

import Combine
import Foundation

class Foo {

    private var cancellables = [AnyCancellable]()

    func startSomeTask() -> Future<Void, Never> {
        Future<Void, Never> { promise in
            DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2)) {
                promise(.success(()))
            }
        }
    }

    func taskCaller() {
        startSomeTask()
            .sink { print("Do your stuff") }
            .store(in: &cancellables)
    }

}
Run Code Online (Sandbox Code Playgroud)

每次taskCaller调用时,AnyCancellable都会创建一个并存储在数组中。我想在它完成时从数组中删除该实例以避免内存浪费。

我知道我可以做这样的事情,而不是数组

var taskCancellable: AnyCancellable?
Run Code Online (Sandbox Code Playgroud)

并通过执行以下操作存储可取消项:

taskCancellable = startSomeTask().sink { print("Do your stuff") }
Run Code Online (Sandbox Code Playgroud)

但是这样会结束创建多个可取消的并且会污染代码。我不想要这样的课程

class Bar {

    private var task1: AnyCancellable?
    private var …
Run Code Online (Sandbox Code Playgroud)

swift combine

7
推荐指数
2
解决办法
1248
查看次数

运行 Swift Package Plugin 时 Xcode Cloud 无写入权限

我有这个插件

struct Main: BuildToolPlugin {
  func createBuildCommands(context: PluginContext, target: Target) async throws -> [Command] {
    let inputFolder = target.directory.appending("Image")
    let output = context.pluginWorkDirectory.appending("GeneratedImageAssets.swift")
    return [
      .buildCommand(
        displayName: "Running ImageAssets parser",
        executable: try context.tool(named: "ImageAssetsParser").path,
        arguments: [inputFolder.string, output.string],
        environment: [:],
        inputFiles: [inputFolder],
        outputFiles: [output]
      )
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

ImageAssetsParser是一个executableTarget快速代码,用于扫描文件夹并将它们写入output插件发送的文件夹中。

虽然在本地它可以正常工作,但在 Xcode Cloud 上我收到权限错误:

在此输入图像描述

奇怪的是,我还有一个prebuildCommand插件,它使用swiftgen, 作为 anartifactbundle并且它工作正常,它写在同一个文件夹中。

我错过了什么吗?

swift swift-package-manager xcode-cloud swift-package-plugin

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

我应该将 Core Location 方法放在 VIPER/MVP iOS 项目中的什么位置?

我搜索了很多,我知道视图控制器实际上是 Viper 或 MVP 架构中的“视图”,Presenter 包含逻辑......但是既然 Presenter 应该易于测试,那么放置 Core Location 的东西(像 LocationManager 和位置更新)到演示者?或者我应该放入视图控制器并通知演示者?

mvp viper core-location ios swift

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

@propertyDelegate和@propertyWrapper之间的区别

@propertyWrapper和之间有@propertyDelegate什么区别?他们在所有WWDC19视频中都谈到@propertyWrapper,但是所有实际的实现方式都使用@propertyDelegate(即SwiftUI-State);编译器Xcode 11 Beta似乎接受两者并要求完全相同的要求:

@propertyDelegate struct A {

}
// Property delegate type 'A' does not contain a non-static property named 'value'
Run Code Online (Sandbox Code Playgroud)
@propertyWrapper struct A {

}
// Property delegate type 'A' does not contain a non-static property named 'value'
Run Code Online (Sandbox Code Playgroud)

请注意,在两种情况下,编译器均会显示“属性委托”

我是否想念某些东西,或者是因为他们尚未决定使用哪个名称?

swift swift5.1

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