小编And*_*net的帖子

为“任何 iOS 设备”构建 Swift 包时找不到 SwiftUI 或组合类型

我有一个支持 iOS 10、macOS 10.13、tvOS 10 和 watchOS 2 的 Swift 包。我希望这个包公开一些 SwiftUI 功能,当引用模块可以导入 SwiftUI 时可以使用这些功能。例如,使我的包类型(Persisted)符合SwiftUI协议DynamicProperty

#if canImport(SwiftUI)
import SwiftUI

@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)
extension Persisted: DynamicProperty { }

#endif
Run Code Online (Sandbox Code Playgroud)

完成上述操作后,在为“任何 iOS 设备(arm64)”构建时不再构建项目 - 我收到编译器错误:

在范围内找不到类型“DynamicProperty”

当我将构建目标更改为任何 iPhone 模拟器时,它构建正常。当为“任何 Mac”、“任何 tvOS 设备”等构建时,它也可以正常构建。我需要做什么才能为任何 iOS 构建包?

ios swift swift-package-manager swiftui combine

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

我可以将 PushStreamContent 添加到 MultipartFormDataContent 而不需要 HttpClient 缓冲整个请求吗?

我正在尝试使用MultipartFormDataContent. 为了以块的形式发送文件,我使用它将PushStreamContent数据块从文件流写入输出流,每次写入后刷新:

PushStreamContent pushStreamContent = new PushStreamContent((stream, content, context) => {
    byte[] buffer = new byte[4096];
    int bytesRead;
    do {
        bytesRead = fileStream.Read(buffer, 0, 4096);
        stream.Write(buffer, 0, bytesRead);
        stream.Flush();
    }
    while(bytesRead != 0);
    stream.Close();
});
Run Code Online (Sandbox Code Playgroud)

如果我HttpContent使用以下代码发布此内容,则一切正常:

new HttpClient().PostAsync(destinationUrl, pushStreamContent);
Run Code Online (Sandbox Code Playgroud)

但是,如果将其PushStreamContent添加到 a 中MultipartFormDataContent,如下所示:

MultipartFormDataContent postForm = new MultipartFormDataContent {
    {stringContent, "atom"},
    {pushStreamContent, "binary"}
};
Run Code Online (Sandbox Code Playgroud)

并将发布,然后我OutOfMemoryException在 的 lambda 内收到一个PushStreamContent。据推测,它HttpClient正在将整个数据缓冲MultipartFormDataContent到内存中,但由于请求内容非常大,因此失败。我希望客户能够推迟所包含的内容的冲洗PushStreamContent …

.net c# post multipartform-data dotnet-httpclient

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

当上下文初始化为内联时,为什么 NSManagedObject 不会插入到子 NSManagedObjectContext 中?

NSManagedObjectContext在我的 iOS 应用程序中使用 child 作为便签本。我正在使用 的扩展NSManagedObjectContext来创建子上下文,如下所示:

extension NSManagedObjectContext {
    func childContext(concurrencyType: NSManagedObjectContextConcurrencyType = .mainQueueConcurrencyType) -> NSManagedObjectContext {
        let childContext = NSManagedObjectContext(concurrencyType: concurrencyType)
        childContext.parent = self
        return childContext
    }
}
Run Code Online (Sandbox Code Playgroud)

NSManagedObject当将新的内容插入新的子上下文(从viewContexta创建NSPersistentContainer)时,我的应用程序的一部分重复出现错误,并显示以下消息:

CoreData:错误:从上下文中删除托管对象后对其进行更改

这很奇怪,因为应用程序的其他部分(也使用子上下文)运行良好。NSManagedObject最终,我将原因缩小到将新的(实体名称“Book”)插入新的子上下文的方式上的一个小差异。以下内容按预期工作:

let childContext = container.viewContext.childContext()
let object1 = NSEntityDescription.insertNewObject(forEntityName: "Book", into: childContext)
print(object1.managedObjectContext == nil)
// prints "false"
Run Code Online (Sandbox Code Playgroud)

但是,如果我内联创建子上下文(即未分配给变量,则托管对象不会插入到上下文中):

let object2 = NSEntityDescription.insertNewObject(forEntityName: "Book", into: container.viewContext.childContext())
print(object2.managedObjectContext == nil)
// prints "true"
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎很奇怪并且无法弄清楚。一切都在主线程上运行。我还创建了一个Swift …

core-data nsmanagedobject nsmanagedobjectcontext ios swift

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

Swift 5.1不透明结果类型如何与旧版操作系统(例如iOS 12)进行交互

在WWDC 2019会议402“ Swift的新增功能 ”中,演讲者在讨论Swift 5.1功能“ 不透明结果类型”(SE-0244)时,提到该功能仅适用于新的OS:

需要新的Swift运行时支持

    在macOS Catalina,iOS 13,tvOS 13,watchOS 6和更高版本上可用

    在部署到较早的OS版本时,Guard与可用性检查配合使用

在Xcode 11中,如果我针对iOS 11及更高版本使用此功能编写代码,则不会收到任何构建错误(或警告)。我没有在if #available(iOS 13.0, *)检查中包装任何代码。例如:

protocol Shape { }
class Square: Shape { }
class Triangle: Shape { }

func foo() -> some Shape {
    return Square()
}
Run Code Online (Sandbox Code Playgroud)

然后foo()从我的应用中的某些代码调用。

如果此代码在iOS 13之前的设备上运行会怎样?缺少构建错误本身就是错误吗?是否有明确的清单说明哪些Swift 5.1功能需要新的运行时支持,因此需要特定的OS版本?

xcode ios swift swift5.1

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