小编Nic*_*las的帖子

如何:使用 Combine 在后台对 CoreData 更改做出反应

我想实现以下目标:每当有人触发 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 上运行的下游任务检索通知?

core-data ios swift swift5 combine

9
推荐指数
2
解决办法
4422
查看次数

如何在保持行顺序的同时从 Pandas DataFrame 中采样

给定任何二维 DataFrame,您可以调用例如。df.sample(frac=0.3)检索样本。但此示例的行顺序将完全打乱。

有没有一种简单的方法来获取保留行顺序的子样本?

python dataframe pandas

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

@Environment(\.presentationMode) 在 SwiftUI 中触发许多(不必要的?)视图重新加载

假设您的视图层次结构为(下面的最小示例)。

\n

Outer (Navigation)View-> (Pushed) ContainerDetailView->(Embedded) View

\n

单击外部视图中的 a NavigationLink,推送包含嵌入视图的详细信息视图。如果您print在函数中添加一些语句init来查看加载视图的频率,则一切正常且符合预期(每个视图打印 1 次)。

\n

然而——问题来了——如果你包括

\n

@Environment(\\.presentationMode) var presentationMode: Binding<PresentationMode>

\n

在中间视图中,它将多次重新加载(初始化新对象)嵌入视图。在最小的例子中是 3 次。这是为什么?我只能怀疑它与在内部推送导航堆栈上的某些内容有关,更改环境变量,导致中间视图的视图主体无效,从而触发子视图的重新加载。

\n

(Embedded) View然而,如果有修饰符,它会变得更好.toolbar。如果是这种情况,视图\xc3\xacnit总共会被 ed 5 次,而只被压入堆栈一次。这是为什么?可以避免吗?

\n

这是一个最小的示例(我在 XCode 12 和 iOS 14.5 中的模拟器和设备上得到了这种行为)。

\n
import 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)

ios swift swiftui

6
推荐指数
0
解决办法
710
查看次数

使用Xcode以编程方式在Mac OS上更改显示旋转

我正在尝试编写一个小的Objective-C命令行工具来调整给定显示的旋转.

可悲的是,我在Apple的文档中找不到任何引用如何更改轮换(除了获取它)之外的参考.我认为必须使用,CGDisplayModeRef但我不知道如何.任何帮助,将不胜感激!

macos objective-c quartz-graphics

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

Ruby:带有转义反斜杠的JSON.parse

我有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)

我究竟做错了什么?

ruby json escaping

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

在Combine 中的flatMap 中发布者过早完成

我有这个最小的例子:

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 个值到达接收器。为什么是这样?该文件 …

ios swift combine

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