2016-04-20 2 views
3

Я имею ошибку:«Это приложение модификация autolayout двигателя от фонового потока»

Это приложение модификации autolayout двигателя от фонового потока, что может привести к повреждению двигателя и странным авариям

всякий раз, когда я пытаюсь загрузить изображение в виде таблицы. Соответствующий код выглядит следующим образом:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cellIdentifier = "ArticleCell" 
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! ArticleCell 


    let a: Article = self.articlesArray[indexPath.row] as! Article 
    //let a: Article = self.newArticlesArray[indexPath.row] as! Article 

    cell.titleLabel.text = a.title 
    cell.descLabel.text = a.desc 

    let data = NSData(contentsOfURL: a.thumbnail) 
    cell.iView.image = UIImage(data: data!) 

    return cell 
} 

func downloadArticles(){ 
    //JSON parsing methods here 
     self.syncCompleted = true 
     dispatch_async(dispatch_get_main_queue()) { 
      self.tableView.reloadData() 
     } 
    } 
    task.resume() 
} 

Каждый раз, когда я нажимаю изображение в моей таблице просмотра движения изображения слева от ячейки, и если изображение, которое я загружен не размер UIImageView затем изменяет размер все это.

Как исправить эту ошибку?

Я пробовал код dispatch_get_main_queue, но, похоже, для меня это не делает.

+1

Можете ли вы установить контрольную точку внутри своего «tableView: cellForRowAtIndexPath:», а затем проверить трассировку стека, откуда она была вызвана? Если он находится в фоновом потоке, вы обычно должны видеть, откуда возникла перезагрузка таблицы. Таким образом, вы можете обнаружить, где вам нужно отправить в основную очередь ... –

+0

@ Tirat2131 Когда я попытался воспроизвести подобную проблему, я получил ** Stack trace ** вместе с указанным вами сообщением. Вы получаете трассировку стека в журнале? Можете ли вы предоставить это, если у вас есть? –

+0

Как мне все это сделать? –

ответ

4

Давайте определим точный путь выполнения, который приведет к повреждению двигателя автомата. Для этого нужно добавить символической точки останова к следующему:

+[NSException raise:format:] 

Вы можете сделать это следующим образом:

enter image description here

Тогда:

enter image description here

После этого один раз ваше приложение застряло в точке останова, пожалуйста, возьмите трассировки стека. Вы можете сделать это с помощью консоли lldb:

(lldb) bt 
* thread #4: tid = 0x2bbc48, 0x000000010ba5ebf0 CoreFoundation`+[NSException raise:format:], queue = 'com.apple.root.default-qos', stop reason = breakpoint 1.1 
    * frame #0: 0x000000010ba5ebf0 CoreFoundation`+[NSException raise:format:] 
    frame #1: 0x0000000108dd5b6b Foundation`_AssertAutolayoutOnMainThreadOnly + 79 
    frame #2: 0x0000000108dd5a62 Foundation`-[NSISEngine _optimizeWithoutRebuilding] + 49 
    frame #3: 0x0000000108c34c0f Foundation`-[NSISEngine optimize] + 46 
    frame #4: 0x0000000108c3b875 Foundation`-[NSISEngine constraintDidChangeSuchThatMarker:shouldBeReplacedByMarkerPlusDelta:] + 313 
    frame #5: 0x0000000108c3b6f2 Foundation`-[NSISEngine tryToChangeConstraintSuchThatMarker:isReplacedByMarkerPlusDelta:undoHandler:] + 440 
    frame #6: 0x0000000108c27715 Foundation`-[NSLayoutConstraint _tryToChangeContainerGeometryWithUndoHandler:] + 484 
    frame #7: 0x0000000108c27274 Foundation`-[NSLayoutConstraint _setSymbolicConstant:constant:] + 422 
    frame #8: 0x0000000108ac35d5 iosapp`ViewController.(self=0x00007fe86a6abc80) ->()).(closure #1) + 133 at ViewController.swift:26 
    frame #9: 0x0000000108ac3627 iosapp`thunk + 39 at ViewController.swift:0 
    frame #10: 0x000000010c775d9d libdispatch.dylib`_dispatch_call_block_and_release + 12 
    frame #11: 0x000000010c7963eb libdispatch.dylib`_dispatch_client_callout + 8 
    frame #12: 0x000000010c77eb2f libdispatch.dylib`_dispatch_root_queue_drain + 1829 
    frame #13: 0x000000010c77e405 libdispatch.dylib`_dispatch_worker_thread3 + 111 
    frame #14: 0x000000010cad34de libsystem_pthread.dylib`_pthread_wqthread + 1129 
    frame #15: 0x000000010cad1341 libsystem_pthread.dylib`start_wqthread + 13 
(lldb) 

После того как вы это сделали, мы сможем определить точное место, которое вызывает проблему.

+0

В моем случае просто 'bt' было недостаточно ... Мне пришлось проверить аргументы' NSException', чтобы выяснить, какой элемент запускал исключение: 'po (char *) $ arg6' < - Дает вам полное описание этого –

Смежные вопросы