I've reduced the code that causes the threading violation error down to something just like this (names of entities changed to protect client's interests):
class Folder: NSManagedObject {
static let entityName = "Folder"
}
class Something: NSManagedObject {
static let entityName = "Something"
@NSManaged var folder: Folder
@NSManaged var uid: Int64
static func findSomethingInFolder(folder: Folder, withUid uid: Int64, inContext context: NSManagedObjectContext) -> Something? {
var something: Something?
context.performBlockAndWait {
let folder = try! context.existingObjectWithID(folder.objectID) as! Folder
let predicate = NSPredicate(format: "(uid == %@) AND (folder == %@)",
NSNumber(longLong: uid), folder)
let request = NSFetchRequest(entityName: entityName)
request.predicate = predicate
request.returnsObjectsAsFaults = false
request.fetchLimit = 1
let results = try! context.executeFetchRequest(request)
let somethings = results as! [Something]
let something = somethingss.first
}
return something
}
}
When this code is executed with CoreData concurrency checking enabled, it stops with a multithreading violation on the line "let results = try! context.executeFetchRequest(request)", but only on iOS 8.4 (simulator & device), built with Xcode 7.1.1.