2015-07-16 5 views
1

Я получаю ответ от json массива от конкретного URL-адреса
По первому запросу каждая вещь работает нормально, но когда второй запрос идет, сбой приложения.__pthread_kill по второму запросу

libsystem_kernel.dylib`__pthread_kill: 0x1082f885c: MOVL $ 0x2000148,% EAX 0x1082f8861: MOVQ% RCX,% r10 0x1082f8864: системный вызов 0x1082f8866: Чже 0x1082f8870; __pthread_kill + 20 0x1082f8868: movq% rax,% rdi 0x1082f886b: jmp 0x1082f5175; cerror_nocancel 0x1082f8870: retq
0x1082f8871: NOP
0x1082f8872: NOP
0x1082f8873: NOP



StackTrace

2015-07-16 13: 44: 37,126 Контактная книга [15714: 106637] * Сбой утверждения в - [UITableView _endCellAnimationsWithContext:],/SourceCache/UIKit_Sim/UIKit-3318/UITableView.m: 1582 2015-07-16 13: 44: 37.341 Контактная книга [15714: 106637] * Завершение приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: «Неверное обновление: недопустимое количество строк в раздел 0. Количество строк, содержащихся в существующем разделе после обновления (1), должно быть равно количеству строк, содержащихся в этом разделе, перед обновлением (11), плюс или минус количество строк, вставленных или удаленных из этого раздела (1 вставлено, 0 удалено) и плюс или минус количество строк, перемещенных в или из этого раздела (0 перемещен, 0 перемещен). ' *** Первый стек бросить вызов: ( 0 CoreFoundation 0x0000000105cd53f5 exceptionPreprocess + 165 1 libobjc.A.dylib 0x0000000107803bb7 objc_exception_throw + 45 2 CoreFoundation 0x0000000105cd525a + [NSException рейза: Формат: аргументы:] + 106 3 Фонд 0x000000010616c28f - [NSAssertionHandler handleFailureInMethod: объект: файл LINENUMBER: описание:] + 195 4 UIKit 0x000000010663346a - [UITableView _endCellAnimationsWithContext:] + 11746 5 Контакт Книга 0x0000000105ae6a11 _TFFC12Contact_Book20MasterViewController38updateSearchResultsForSearchControllerFS0_FCSo18UISearchControllerT_U_FTGSQCSo6NSData_GSQCSo13NSURLResponse_GSQCSo7NSError__T_ + 2625 6 Контактная книга 0x0000000105ae6bb3 _TTRXFo_oGSQCSo6NSData_oGSQCSo13NSURLResponse_oGSQCSo7NSError__dT__XFo_iTGSQS__GSQS0__GSQS1____iT + 51 7 Контактная книга 0x0000000105ae4091 _TPA__TTRXFo_oGSQCSo6NSData_oGSQCSo13NSURLResponse_oGSQCSo7NSError__dT__XFo_iTGSQS__GSQS0__GSQS1____iT__ + 81 8 Контактная Книга 0x0000000105ae6e83 _TTRXFo_iTGSQCSo6NSData_GSQCSo13NSURLResponse_GSQCSo7NSError___iT__XFo_oGSQS__oGSQS0__oGSQS1___dT__ + 35 9 Контактная Книга 0x0000000105ae6f0f _TTRXFo_oGSQCSo6NSData_oGSQCSo13NSURLResponse_oGSQCSo7NSError__dT__XFdCb_dGSQS__dGSQS0__dGSQS1___dT__ + 127 10 CFNetwork 0x0000000108aaebbb 49 - [__ NSCFLocalSessionTask _task_onqueue_didFinish] _block_invoke + 157 11 Фонд 0x000000010618fccf __NSBLOCKOPERATION_IS_CALLING_OUT_TO_A _block + 7 12 Фонд 0x00000001060cfb32 - [NSBlockOperation главную] + 98 13 Фонд 0x00000001060b2104 - [__ NSOperationInternal _start:] + 645 14 Фонд 0x00000001060b1d13 __NSOQSchedule_f + 184 15 libdispatch.dylib 0x0000000107fa87f4 _dispatch_client_callout + 8 16 libdispatch.dylib 0x0000000107f90bf4 _dispatch_queue_drain + 1417 17 libdispatch.dylib 0x0000000107f90506 _dispatch_queue_invoke + 235 18 libdispatch.dylib 0x0000000107f92ff7 _dispatch_root_queue_drain + 682 19 libdispatch.dylib 0x0000000107f9463c _dispatch_worker_thread2 + 52 20 libsystem_pthread.dylib 0x000000010833eef8 _pthread_wqthread + 314 21 libsystem_pthread.dylib 0x0000000108341fb9 start_wqthread + 13 ) LibC++ abi.dylib: завершение с неперехваченного исключением типа NSException (lldb)

я следующий код

import UIKit 

class MasterViewController: UITableViewController,  UISearchControllerDelegate, UISearchResultsUpdating, UISearchBarDelegate { 

var completeData = NSMutableArray() 
var nameData = NSMutableArray() 


override func awakeFromNib() { 
    super.awakeFromNib() 
} 


var searchController : UISearchController! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.searchController = UISearchController(searchResultsController: nil) 

    self.searchController.searchResultsUpdater = self 
    self.searchController.delegate = self 
    self.searchController.searchBar.delegate = self 

    self.searchController.hidesNavigationBarDuringPresentation = false 
    self.searchController.dimsBackgroundDuringPresentation = true 
    self.navigationItem.titleView = searchController.searchBar 

    self.definesPresentationContext = true 
} 
    var flag = false 
    var task: NSURLSessionTask! 

func updateSearchResultsForSearchController(searchController: UISearchController) { 
    var inputText = searchController.searchBar.text as NSString 

    if inputText.length > 3 { 
     //TODO repalce space by %20 

     if flag{ 
      task.cancel()} 

     let url = NSURL(string: "http://172.26.1.39:8080/ContactBook/search?term="+inputText); 

     task = NSURLSession.sharedSession().dataTaskWithURL(url){(data, response, error) in 

      if(error != nil){ 
       println("SOME ERROR") 
       return 
      } 

      var parseError: NSError? 

      var jsonArray = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments, error: &parseError) as NSArray 

      if parseError != nil { 
       println("something wrong") 
       return 
      } 


      self.completeData.removeAllObjects() 
      self.nameData.removeAllObjects() 

      var tempObject : NSDictionary; 

      for var i=0; i < jsonArray.count; i++ { 
       var jsonDict = jsonArray[i] as NSDictionary 
       self.completeData.insertObject(jsonDict, atIndex: 0) 
       var name = jsonDict.valueForKey("name")! as NSString 
       self.nameData.insertObject(name, atIndex: 0) 
       let indexPath = NSIndexPath(forRow: 0, inSection: 0) 
       self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 
      } 
     } 
     flag = true 
     task.resume() 
    } 
} 


override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

// MARK: - Segues 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "showDetail" { 
     if let indexPath = self.tableView.indexPathForSelectedRow() { 
      let object = completeData[indexPath.row] as NSDictionary 
      (segue.destinationViewController as DetailViewController).detailItem = object 
     } 
    } 
} 

// MARK: - Table View 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return nameData.count 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell 
    let object = nameData[indexPath.row] as NSString 
    cell.textLabel?.text = object.description 
    return cell 
} 

override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { 
    // Return false if you do not want the specified item to be editable. 
    return false 
} 
} 

ответ

2

Это довольно ясно, сообщение об ошибке, просто прочитать его. Цитата:

Нагрузочного приложение из-за неперехваченное исключением «NSInternalInconsistencyException», причина: «Invalid обновления: недопустимый количества строк в разделе 0. Число строк, содержащихся в существующей секции после обновления (1) должно быть равно числу строк , содержащихся в этом разделе, перед обновлением (11) плюс или минус количество строк, вставленных или удаленных из этого раздела (1 вставлено, 0 удалено) и плюс или минус количество строк перемещается в или из , что раздел (0 перемещен, 0 перемещен).

Он говорит:

  • после обновления (вставка/удаление) вы получили 1 ячейку в разделе 0,
  • но прежде чем вы сделали обновить вид таблицы, нужно было 11 клеток есть , то вы сделали вставки 1 клетку, таким образом, он ожидает, что 11 + 1 клетки, а не 1

Проблема заключается в том, что число клеток в разделе 0 составляет nameData.count. И ваш код (удаленные несвязанные части) ...

self.nameData.removeAllObjects() <----- (delete) 

var tempObject : NSDictionary; 

for var i=0; i < jsonArray.count; i++ { 
    var jsonDict = jsonArray[i] as NSDictionary 
    var name = jsonDict.valueForKey("name")! as NSString 
    self.nameData.insertObject(name, atIndex: 0) <----- (insert) 
    let indexPath = NSIndexPath(forRow: 0, inSection: 0) 
    self.tableView.insertRowsAtIndexPaths([indexPath], 
    withRowAnimation: .Fade) <------ (insert) 
} 

... удаляет все объекты из self.nameData, но не с точки зрения таблицы.

Элементы таблицы просмотра и хранилище резервных копий не синхронизированы.

Reload Data

Удалить self.tableView.insert... линию и поместите self.tableView.reloadData() только после того, как цикл. Он перезагружает весь вид таблицы.

self.nameData.removeAllObjects() 

var tempObject : NSDictionary; 

for var i=0; i < jsonArray.count; i++ { 
    var jsonDict = jsonArray[i] as NSDictionary 
    var name = jsonDict.valueForKey("name")! as NSString 
    self.nameData.insertObject(name, atIndex: 0) 
    let indexPath = NSIndexPath(forRow: 0, inSection: 0) 
} 
self.tableView.reloadData() 

Или перезагрузите только одну секцию.

func reloadSections(_ sections: NSIndexSet) 

Удалить элементы & Затем вставьте

Если вы не хотите, чтобы перезагрузить все ячейки (весь вид таблицы), вы должны иметь в виду, что ваше резервное хранилище данных должны быть синхронизированы с табличный вид.Другими словами - если вы удалите ячейку из вида таблицы, вы должны удалить ее из своего резервного хранилища. Если вы вставляете ячейку в табличный вид, вы должны вставить ее в хранилище резервных копий. И наоборот.

В вашем случае вы вызываете self.nameData.removeAllObjects(), но вы не сделали удалите элементы таблицы для этих объектов. Вы должны позвонить ...

func deleteItemsAtIndexPaths(_ indexPaths: [NSIndexPath]) 

... на self.tableView для всех объектов ты удалить из self.nameData.

Если вы делаете много звонков deleteItems.../insertItems/..., это хорошо, чтобы обернуть их в performBatchUpdates(_:completion:):

func performBatchUpdates(_ updates: (() -> Void)?, 
    completion completion: ((Bool) -> Void)?) 

Анимирует несколько вставки, удаления, перезарядка, и переместить работу в группе.

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