我有一个支持 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 构建包?
我正在尝试使用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 …
我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 …
在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版本?