有没有一种好方法来处理完成/取消时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) 我有这个插件
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
我搜索了很多,我知道视图控制器实际上是 Viper 或 MVP 架构中的“视图”,Presenter 包含逻辑......但是既然 Presenter 应该易于测试,那么放置 Core Location 的东西(像 LocationManager 和位置更新)到演示者?或者我应该放入视图控制器并通知演示者?
@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)
请注意,在两种情况下,编译器均会显示“属性委托”。
我是否想念某些东西,或者是因为他们尚未决定使用哪个名称?