Swift: точка останова в библиотеке CoreData
Xcode 6 Beta 3 с помощью Swift.
в моем приложении я использую CoreData. Когда я запускаю свое приложение в симуляторе, XCode всплывает отладчик с точкой останова, установленной где-то в библиотеке CoreData (см. скриншот). Это происходит в нескольких функциях CoreData, например при вставке новых записей или извлечении записей из сущности. Положение останова всегда одинаков.
это очень раздражает. Когда мое приложение получает 10 записей сущность я должен нажать продолжить выполнение программы кнопка 10 раз.
поскольку эта точка останова установлена где-то в машинном коде, инспектор точек останова не показывает никаких точек останова, поэтому я не могу удалить ее.
кто-нибудь знает как избавиться от него?
большое спасибо.
Edit: backtrace-вывод:
(lldb) bt * поток #1: tid = 0x1d68b0, 0x000000010a2f7fcd libswift_stdlib_core.dylib нужна
swift_dynamicCastClassUnconditional + 77, queue = 'com.apple.main-thread', stop reason = EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0) * frame #0: 0x000000010a2f7fcd libswift_stdlib_core.dylib
swift_dynamicCastClassUnconditional + 77 рамка #1: 0x000000010a0fbb85 GPS трекGPS_Track.TrackListTableViewController.tableView (tableView=<unavailable>)(Swift.ImplicitlyUnwrappedOptional<ObjectiveC.UITableView>, cellForRowAtIndexPath : Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSIndexPath>) -> Swift.Optional<ObjectiveC.UITableViewCell> + 1125 at TrackListTableViewController.swift:53 frame #2: 0x000000010a0fc937 GPS Track
@objc GPS_Track.TrackListTableViewController.метод TableView (GPS_Track.TrackListTableViewController) (Swift.ImplicitlyUnwrappedOptional, cellForRowAtIndexPath: Swift.ImplicitlyUnwrappedOptional) - > Swift.Дополнительно + 87 в TrackListTableViewController.swift: 0 Кадр № 3: программирования с использованием UIKit 0x000000010bc2f218-[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 508 frame #4: 0x000000010bc0f340 UIKit
- [UITableView _updateVisibleCellsNow:isRecursive:] + 2845 рамка #5: 0x000000010bc24fea UIKit-[UITableView layoutSubviews] + 213 frame #6: 0x000000010bbb1ebd UIKit
- [UIView (CALayerDelegate) layoutSublayersOfLayer:] + 519 рамка #7: 0x000000010b9c9598 QuartzCore-[CALayer layoutSublayers] + 150 frame #8: 0x000000010b9be1be QuartzCore
CA:: слой:: layout_if_needed(CA:: Transaction*) + 380 рамка #9: 0x000000010b9be02e QuartzCoreCA::Layer::layout_and_display_if_needed(CA::Transaction*) + 24 frame #10: 0x000000010b92cf16 QuartzCore
CA:: Context:: commit_transaction (CA::Transaction*) + 242 рамка #11: 0x000000010b92e022 QuartzCoreCA::Transaction::commit() + 390 frame #12: 0x000000010b92e68d QuartzCore
CA:: Transaction:: observer_callback (__CFRunLoopObserver*, без знака long, void*) + 89 рамка #13: 0x000000010ab52927 CoreFoundation__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23 frame #14: 0x000000010ab52880 CoreFoundation
__CFRunLoopDoObservers + 368 рамка #15: 0x000000010ab480d3 CoreFoundation__CFRunLoopRun + 1123 frame #16: 0x000000010ab47a06 CoreFoundation
CFRunLoopRunSpecific + 470 рамка #17: 0x000000010e9e9abf GraphicsServicesGSEventRunModal + 161 frame #18: 0x000000010bb39cf8 UIKit
UIApplicationMain + 1282 рамка #19: 0x000000010a0e6a5d GPS трекtop_level_code + 77 at AppDelegate.swift:36 frame #20: 0x000000010a0e6a9a GPS Track
main + 42 в AppDelegate.swift: 0 рамка #21: 0x000000010d2e7145 libdyld.dylib нужна лишь начало + 1 (символы отладки)
8 ответов
Я проследил его дальше: проблема возникает только при использовании пользовательских классов объектов для организаций. Пример:
// User class, defined in User.swift
class User: NSManagedObject {
@NSManaged var name: String
@NSManaged var firstname: String
}
// --------------
// code somewhere else
let users = moc.executeFetchRequest(fetchRequest, error: &error)
for object in users {
let user = object as User // <-- breakpoint fired here
println(user.name)
}
}
устранение:
необходимо сделать пользовательский класс объекта видимым для Objective C с помощью директивы @objc:
// User class, defined in User.swift
@objc(User) // <-- required!
class User: NSManagedObject {
@NSManaged var name: String
@NSManaged var firstname: String
}
спасибо всем за помощь!
У вас установлена точка останова все исключения?
вопреки лучшим практикам Apple, CoreData использует исключения в обычном потоке управления.
Если вы добавляете точки останова исключений, вы можете сломать CoreData. Решение состоит в том, чтобы удалить или отключить точку останова исключения.
в то время как вышеуказанные ответы все технически правильны
@zisoft прав, однако, если вы используете пользовательские классы NSManagedObject, вы всегда должны использовать @objc (User), а не только из-за этой точки останова.
@Zaph также может работать, так как вы по существу не слушаете, и если это действительно ошибка, она должна остановить ее появление
однако вы все равно можете попасть в эту точку останова, если вы не проверяете тип. Я подозреваю, что это точка останова в beta 4, но станет крахом в следующей бета-версии.
Я решил проблему в своем коде, когда я нажимал на возврат управляемого объекта, полученного от insertNewObjectForEntityForName как AnyObject, а затем сказал, как myclass, когда я его использовал. Я знал, что это мой класс. но на самом деле надо было сделать что-то подобное
func createMyEntity() -> MyClass{
if let entity : MyClass = NSEntityDescription.insertNewObjectForEntityForName("MyClass", inManagedObjectContext: self.managedObjectContext) as? MyClass
{
return entity;
}
return nil;
}
очевидно, что это только один пример, но если вы попадаете в точку останова в других местах, то, надеюсь, это хорошо ссылка.
не выдерживая это все еще может быть просто ошибка в бета-версии 4 xcode, но это в любом случае безопаснее.
Update -- он также проверяет, что имя класса модели данных совпадает, как это позже через предупреждение здесь, и это также может быть причиной попадания в точку останова.
я исправил свою версию этой проблемы на основе информации в https://devforums.apple.com/message/1016337#1016337
- сделать
NSManagedObject
-производный класс и его соответствующие свойстваpublic
- не включайте его исходный файл в источники компиляции тестовой цели
- импорт целевого приложения в тестовом файле -- например,
import MyApp
наMyClassTests.swift
в ваших основных данных *.xcdatamodeld
file, префикс имя класса вашей сущности с именем вашего приложения. Это должно выглядеть примерно так, когда вы закончите:
спасибо последнее помогло!!!
- сделать NSManagedObject-производный класс и его соответствующие свойства общественных
- не включайте его исходный файл в источники компиляции тестовой цели
- импорт целевого приложения в тестовом файле - например, импорт MyApp в MyClassTests.Свифт!--4-->
следующие помогли мне ! Если я отменю одну из этих настроек, ошибка точки останова повторится !
вы должны установить для своей модели сущности в своей * модели.xcdatamodeld в свойстве "Class" пример с тем же именем: Name=Chat Class=Chat
вы должны добавить код @objc (yourClass) выше свой класс
Фото 1: http://i.stack.imgur.com/xoxtu.png
картинки Два: http://i.stack.imgur.com/LkYYq.png
при использовании Xcode 6.2
- сделать
@objc
изменения в вашем классе i.e@objc(className)
- далее перейти к
*.xcdatamodeld
->Configurations
(по умолчанию, если ничего не указано) - > добавить класс против сущности