Swift: точка останова в библиотеке CoreData

Xcode 6 Beta 3 с помощью Swift.

в моем приложении я использую CoreData. Когда я запускаю свое приложение в симуляторе, XCode всплывает отладчик с точкой останова, установленной где-то в библиотеке CoreData (см. скриншот). Это происходит в нескольких функциях CoreData, например при вставке новых записей или извлечении записей из сущности. Положение останова всегда одинаков.

enter image description here

это очень раздражает. Когда мое приложение получает 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.dylibswift_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 QuartzCoreCA:: слой:: layout_if_needed(CA:: Transaction*) + 380 рамка #9: 0x000000010b9be02e QuartzCoreCA::Layer::layout_and_display_if_needed(CA::Transaction*) + 24 frame #10: 0x000000010b92cf16 QuartzCoreCA:: Context:: commit_transaction (CA::Transaction*) + 242 рамка #11: 0x000000010b92e022 QuartzCoreCA::Transaction::commit() + 390 frame #12: 0x000000010b92e68d QuartzCoreCA:: 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 UIKitUIApplicationMain + 1282 рамка #19: 0x000000010a0e6a5d GPS трекtop_level_code + 77 at AppDelegate.swift:36 frame #20: 0x000000010a0e6a9a GPS Trackmain + 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
}

спасибо всем за помощь!


У вас установлена точка останова все исключения?

enter image description here

вопреки лучшим практикам 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, префикс имя класса вашей сущности с именем вашего приложения. Это должно выглядеть примерно так, когда вы закончите:

entity class name prefix


спасибо последнее помогло!!!

  • сделать NSManagedObject-производный класс и его соответствующие свойства общественных
  • не включайте его исходный файл в источники компиляции тестовой цели
  • импорт целевого приложения в тестовом файле - например, импорт MyApp в MyClassTests.Свифт!--4-->

следующие помогли мне ! Если я отменю одну из этих настроек, ошибка точки останова повторится !

  1. вы должны установить для своей модели сущности в своей * модели.xcdatamodeld в свойстве "Class" пример с тем же именем: Name=Chat Class=Chat

  2. вы должны добавить код @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 (по умолчанию, если ничего не указано) - > добавить класс против сущности