我想实现以下目标:每当有人触发 CoreData 保存(即NSManagedObjectContextDidSave发送通知)时,我想根据更改的 NSManagedObject执行一些后台计算。具体示例:假设在一个笔记应用程序中,我想异步计算所有笔记中的总字数。
当前的问题在于 NSManagedObject 上下文显式绑定到线程,并且不鼓励您NSManagedObject在该线程之外使用s。
我NSManagedObjectContext在我的 s 中设置了两个SceneDelegate:
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let backgroundContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.newBackgroundContext()
Run Code Online (Sandbox Code Playgroud)
我也都签署通过的通知NotificationCenter.default.publisher(for: .NSManagedObjectContextDidSave),并正在接收保存的通知两次我只触发后一个 managedObjectContext.save()。但是,这两个通知都是从同一个线程(即 UIThread)发送的,并且NSManagedObjects用户字典中的所有通知都有一个.managedObjectContext是 theviewContext而不是backgroundContext。
我的想法是根据关联NSManagedObjectContext是否为后台来过滤通知,因为我认为通知也是在(私有)DispatchQueue 上发送的,但似乎所有通知都是在 UIThread 上发送的,并且从未使用过后台上下文.
关于如何解决这个问题的任何想法?这是一个错误吗?如何根据backgroundContext正在关联的 DispatchQueue 上运行的下游任务检索通知?
给定任何二维 DataFrame,您可以调用例如。df.sample(frac=0.3)检索样本。但此示例的行顺序将完全打乱。
有没有一种简单的方法来获取保留行顺序的子样本?
假设您的视图层次结构为(下面的最小示例)。
\nOuter (Navigation)View-> (Pushed) ContainerDetailView->(Embedded) View
单击外部视图中的 a NavigationLink,推送包含嵌入视图的详细信息视图。如果您print在函数中添加一些语句init来查看加载视图的频率,则一切正常且符合预期(每个视图打印 1 次)。
然而——问题来了——如果你包括
\n@Environment(\\.presentationMode) var presentationMode: Binding<PresentationMode>
在中间视图中,它将多次重新加载(初始化新对象)嵌入视图。在最小的例子中是 3 次。这是为什么?我只能怀疑它与在内部推送导航堆栈上的某些内容有关,更改环境变量,导致中间视图的视图主体无效,从而触发子视图的重新加载。
\n(Embedded) View然而,如果有修饰符,它会变得更好.toolbar。如果是这种情况,视图\xc3\xacnit总共会被 ed 5 次,而只被压入堆栈一次。这是为什么?可以避免吗?
这是一个最小的示例(我在 XCode 12 和 iOS 14.5 中的模拟器和设备上得到了这种行为)。
\nimport SwiftUI\n\n@main\nstruct SomeSwiftyTestApp: App {\n \n let items = [1,2,3,4]\n \n /* This is the outer view */\n var body: some Scene {\n WindowGroup {\n …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个小的Objective-C命令行工具来调整给定显示的旋转.
可悲的是,我在Apple的文档中找不到任何引用如何更改轮换(除了获取它)之外的参考.我认为必须使用,CGDisplayModeRef但我不知道如何.任何帮助,将不胜感激!
我有AA JSON编码数组看起来像这样(注:这是一个文件,一个字符串的不是内容)["Company\\","NN","Company\\"].这是无效的JSON吗?它包含一个转义\字符,看起来对我来说.然而:
a = '["Company\\","NN","Company\\"]'
=> "[\"Company\\\",\"NN\",\"Company\\\"]"
JSON.parse a
JSON::ParserError: 387: unexpected token at 'NN","Company\"]'
from /Users/nneubauer/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/json/common.rb:148:in `parse'
from /Users/nneubauer/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/json/common.rb:148:in `parse'
from (irb):11
from /Users/nneubauer/.rvm/rubies/ruby-1.9.3-p0/bin/irb:16:in `<main>'
Run Code Online (Sandbox Code Playgroud)
有趣的是:
puts a
["Company\","NN","Company\"]
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我有这个最小的例子:
import UIKit
import Combine
var values = [1,2,3,4,5]
var cancel = values.publisher
.delay(for: 0.1, scheduler: DispatchQueue.global())
.print()
.flatMap() { i in
[i].publisher.first()
}
.sink { completion in
print("Received Completion: \(completion)")
} receiveValue: { v in
print("Received Value: \(v)")
}
Run Code Online (Sandbox Code Playgroud)
我的期望是源发布者将 1 到 5 的值发送到流中。每个数字都被转换成(只是为了它)一个新的发布者,它发出第一个值然后完成。由于这是对每个数字完成的,我希望所有值都到达接收器。然而,情况并非如此。输出如下所示:
request unlimited
receive value: (1)
Received Value: 1
receive value: (2)
Received Value: 2
receive value: (4)
Received Value: 4
receive finished
Received Completion: finished
receive value: (3)
receive value: (5)
Run Code Online (Sandbox Code Playgroud)
实际上,在完成事件到达之前,只有 3 个值到达接收器。为什么是这样?该文件 …