在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)
我的问题是:
我在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
被删除,从关系subject
到course
被删除,这样的故障,以删除Course
不会在显示NSSet
上Subject
的courses
设置.
我想提供一种方法来删除实体中的所有对象.当我尝试这通过单独读取和删除每一个course
,courses
将正确地删除,并从取出NSSet
的courses
一个Subject
.
由于我不知道会有多少人courses
出现,我想确保在任何情况下都能保持高性能,我想我会使用批量删除来删除所有情况courses
.问题是,虽然利用NSBatchDeleteRequest
删除所有Subjects
工作正常,一直删除courses
(由于Cascade
规则),尝试删除所有Courses
使用此方法似乎留下所有对象.
我曾经NSBatchDeleteRequest
删除所有Courses
,但是当我查询MOC
以查看什么Subjects …
我有一个联系人表和位置表,每个联系人都有许多位置
我创建了一个联系人保存,然后创建一个位置并保存,然后将保存的位置分配给联系人.代码如下:
@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) 如何从异步调度块获取返回值?
我想出了这个示例代码:
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
常量,以便我可以使用它.
TLDR:我想知道UndoManager
从后台线程使用时如何基于运行循环自动撤消分组,而我的最佳选择是什么。
我使用UndoManager
(以前NSUndoManager
在与iOS和MacOS的目标定制的斯威夫特框架)。
在框架中,工作体面量呈现背景GCD串行队列的地方。我了解UndoManager
每个运行循环周期会自动将顶级注册的撤消操作分组,但是我不确定不同的线程情况将如何影响这种情况。
我的问题:
UndoManager
的run环路注册撤消操作的分组?在下面的所有情况下,假定methodCausingUndoRegistration()
并且anotherMethodCausingUndoRegistration()
没有幻想,可以UndoManager.registerUndo
在没有任何分派的情况下从调用它们的线程进行调用。
// 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
预期的用法。上面的两个撤消注册都将在同一运行循环周期中进行,因此将被放置在同一撤消组中。
// 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)