小编Mat*_*man的帖子

Swift 3 beta 5中DispatchQueue的AutoreleaseFrequency

在Xcode 8 beta 5中,初始化程序DispatchQueue已更改为接受qos(服务质量),属性和自动释放频率的单独参数.虽然我将代码转换为使用新的初始化程序时没有任何问题,但我不确定某些属性的含义,特别是自动释放频率.

例如,在Xcode 8 beta 3和Swift 3中,我能够创建一个序列DispatchQueue:

let serialQueue = DispatchQueue(label: "Concurrent Map", attributes: [.serial, .qosBackground], target: nil)
Run Code Online (Sandbox Code Playgroud)

在Xcode 8 beta 5和Swift 3中:

let serialQueue = DispatchQueue(label: "Concurrent Map", qos: .background, attributes: [], autoreleaseFrequency: .inherit, target: nil)
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 在新的DispatchQueue.Attributes中,.serial不再是成员.这是否意味着缺少.concurrent会创建一个串行队列.我在Swift Playgrounds做的初步测试似乎证实了这一点.其他人可以确认吗?
  • 我看到DispatchQueue.AutoreleaseFrequency是一个带有.inherit,.never和.workItem的新类型.这些是什么意思?我做了一些关于GCD和自动释放的研究,但我不太熟悉自动释放池的概念.

grand-central-dispatch swift swift3 xcode8

17
推荐指数
2
解决办法
4440
查看次数

核心数据NSBatchDeleteRequest似乎在上下文中保留对象

我在Core Data中看到了很多关于批量删除的问题,但似乎没有一个问题可以解决我的问题.

我正在使用Core Data创建一个iOS 9/Swift应用程序.在今年的WWDC上,我参加了Core Data会议,看到我可以NSBatchDeleteRequest直接从持久性存储中删除大量对象.这适用于某些对象,但不适用于其他对象,我认为这与我的关系有关.

我有一个由Subject和组成的对象图Course,其中有一对多的关系.受试者可以拥有他们希望的许多课程.

Subject删除规则存在"课程"关系Cascade,因为我希望subject在删除a时subject删除与a关联的所有课程.

反向是"主题" Course,删除规则为Nullify.在这里,我对Apple的描述有点困惑Nullify:

删除对象之间的关系但不删除任何对象.只有当员工的部门关系是可选的,或者您确保在下一次保存操作之前为每个员工设置新部门时,这才有意义.

这很清楚,但为什么关系会被删除而不是任何一个对象呢?如果我删除Course,我希望Course被删除,从关系subjectcourse被删除,这样的故障,以删除Course不会在显示NSSetSubjectcourses设置.

我想提供一种方法来删除实体中的所有对象.当我尝试这通过单独读取和删除每一个course,courses将正确地删除,并从取出NSSetcourses一个Subject.

由于我不知道会有多少人courses出现,我想确保在任何情况下都能保持高性能,我想我会使用批量删除来删除所有情况courses.问题是,虽然利用NSBatchDeleteRequest删除所有Subjects工作正常,一直删除courses(由于Cascade规则),尝试删除所有Courses使用此方法似乎留下所有对象.

我曾经NSBatchDeleteRequest删除所有Courses,但是当我查询MOC以查看什么Subjects …

core-data ios

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

CoreData使用nil属性创建和保存额外的实体

我有一个联系人表和位置表,每个联系人都有许多位置

我创建了一个联系人保存,然后创建一个位置并保存,然后将保存的位置分配给联系人.代码如下:

 @IBAction func saveLocation(_ sender: AnyObject) {
    let processName = ProcessInfo.processInfo.globallyUniqueString

    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    let location = Location(context: context)

    do {

        let fetchRequest: NSFetchRequest<Contact> = Contact.fetchRequest()
        fetchRequest.predicate = NSPredicate(format: "uniqueId == %@", contactIdentifierString)
        let fetchedResults = try context.fetch(fetchRequest)
        if let aContact = fetchedResults.first {

            // set location data
            location.uniqueId = processName
            location.locationName = locationNameTextField.text
            location.city = self.city
            location.state = self.state
            location.street = self.street
            location.zip = self.zip
            location.country = self.country


            // save data
            (UIApplication.shared.delegate as! AppDelegate).saveContext()
            location.contact …
Run Code Online (Sandbox Code Playgroud)

core-data swift ios10

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

如何在调度块中获取返回值?

如何从异步调度块获取返回值?

我想出了这个示例代码:

if let url = URL(string: "https://google.com/") {
    let data: Data? = ***SOME_ASYNC_AWAIT_DISPATCH_GROUP<T>*** { return try? Data(contentsOf: url) }
    print("Downloaded Data: \(data)")
}
Run Code Online (Sandbox Code Playgroud)

目标:在这里,我希望异步调用生成结果并将其存储到data常量,以便我可以使用它.

swift swift3

3
推荐指数
2
解决办法
4826
查看次数

UndoManager运行循环分组将如何在不同的线程上下文中受到影响?

TLDR:我想知道UndoManager从后台线程使用时如何基于运行循环自动撤消分组,而我的最佳选择是什么。


我使用UndoManager(以前NSUndoManager在与iOS和MacOS的目标定制的斯威夫特框架)。

在框架中,工作体面量呈现背景GCD串行队列的地方。我了解UndoManager每个运行循环周期会自动将顶级注册的撤消操作分组,但是我不确定不同的线程情况将如何影响这种情况。

我的问题:

  • 什么影响,如果有的话,将在下列情况下对UndoManager的run环路注册撤消操作的分组?
  • 假设所有需要撤消注册的更改都将在单个后台串行分派队列中进行,哪种情况(除了情况1,这是不可行的)最适合提供自然分组?

在下面的所有情况下,假定methodCausingUndoRegistration()并且anotherMethodCausingUndoRegistration()没有幻想,可以UndoManager.registerUndo在没有任何分派的情况下从调用它们的线程进行调用。

情况1:在主线程上内联

// Assume this runs on main thread
methodCausingUndoRegistration()
// Other code here
anotherMethodCausingUndoRegistration()
// Also assume every other undo registration in this framework takes place inline on the main thread
Run Code Online (Sandbox Code Playgroud)

我的理解:这就是UndoManager预期的用法。上面的两个撤消注册都将在同一运行循环周期中进行,因此将被放置在同一撤消组中。

情况2:主线程上的同步调度

// Assume this runs on an arbitrary background thread, possibly managed by GCD.
// It is guaranteed not to run on …
Run Code Online (Sandbox Code Playgroud)

macos grand-central-dispatch runloop ios swift

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