__pthread_kill 第二次请求 [英] __pthread_kill on second request

查看:42
本文介绍了__pthread_kill 第二次请求的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从特定的 url 得到 json 数组响应
在第一个请求时,一切正常,但是当第二个请求发出时,应用程序崩溃.

<块引用>

libsystem_kernel.dylib`__pthread_kill:0x1082f885c:movl $0x2000148,%eax0x1082f8861: movq %rcx, %r100x1082f8864:系统调用0x1082f8866: 杰 0x1082f8870 ;__pthread_kill + 200x1082f8868: movq %rax, %rdi0x1082f886b:jmp 0x1082f5175;cerror_nocancel0x1082f8870:retq
0x1082f8871:没有
0x1082f8872:没有
0x1082f8873:没有



堆栈跟踪

<块引用>

2015-07-16 13:44:37.126 通讯录[15714:106637] * 断言失败 -[UITableView _endCellAnimationsWithContext:],/SourceCache/UIKit_Sim/UIKit-3318/UITableView.m:15822015-07-16 13:44:37.341 通讯录[15714:106637] * 由于未捕获的异常NSInternalInconsistencyException"而终止应用程序,原因:无效更新:第 0 节中的行数无效.行数更新后的现有节中包含的行数 (1) 必须等于更新前该节中包含的行数 (11),加上或减去从该节中插入或删除的行数(插入 1 行,删除 0 行)加上或减去移入或移出该部分的行数(0 移入,0 移出).*** 首先抛出调用堆栈:(0 CoreFoundation 0x0000000105cd53f5 exceptionPreprocess + 1651 libobjc.A.dylib 0x0000000107803bb7 objc_exception_throw + 452 CoreFoundation 0x0000000105cd525a +[NSException raise:format:arguments:] + 1063 基础 0x000000010616c28f -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 1954 UIKit 0x000000010663346a -[UITableView _endCellAnimationsWithContext:] + 117465 通讯录 0x0000000105ae6a11 _TFFC12Contact_Book20MasterViewController38updateSearchResultsForSearchControllerFS0_FCSo18UISearchControllerT_U_FTGSQCSo6NSData_GSQCSo13NSURLResponse_GSQCSo7NSError__T_ + 26256 通讯录 0x0000000105ae6bb3 _TTRXFo_oGSQCSo6NSData_oGSQCSo13NSURLResponse_oGSQCSo7NSError__dT__XFo_iTGSQS__GSQS0__GSQS1____iT + 517 联系簿 0x0000000105ae4091 _TPA__TTRXFo_oGSQCSo6NSData_oGSQCSo13NSURLResponse_oGSQCSo7NSError__dT__XFo_iTGSQS__GSQS0__GSQS1____iT__ + 818 通讯录 0x0000000105ae6e83 _TTRXFo_iTGSQCSo6NSData_GSQCSo13NSURLResponse_GSQCSo7NSError___iT__XFo_oGSQS__oGSQS0__oGSQS1___dT__ + 359 联系簿 0x0000000105ae6f0f _TTRXFo_oGSQCSo6NSData_oGSQCSo13NSURLResponse_oGSQCSo7NSError__dT__XFdCb_dGSQS__dGSQS0__dGSQS1___dT__ + 12710 CFNetwork 0x0000000108aaebbb 49-[__NSCFLocalSessionTask _task_onqueue_didFinish]_block_invoke + 15711 基金会 0x000000010618fccf __NSBLOCKOPERATION_IS_CALLING_OUT_TO_A_BLOCK + 712 基础 0x00000001060cfb32 -[NSBlockOperation main] + 9813 基金会 0x00000001060b2104 -[__NSOperationInternal _start:] + 64514 基金会 0x00000001060b1d13 __NSOQSchedule_f + 18415 libdispatch.dylib 0x0000000107fa87f4 _dispatch_client_callout + 816 libdispatch.dylib 0x0000000107f90bf4 _dispatch_queue_drain + 141717 libdispatch.dylib 0x0000000107f90506 _dispatch_queue_invoke + 23518 libdispatch.dylib 0x0000000107f92ff7 _dispatch_root_queue_drain + 68219 libdispatch.dylib 0x0000000107f9463c _dispatch_worker_thread2 + 5220 libsystem_pthread.dylib 0x000000010833eef8 _pthread_wqthread + 31421 libsystem_pthread.dylib 0x0000000108341fb9 start_wqthread + 13)libc++abi.dylib:以未捕获的 NSException 类型异常终止(lldb)

我有以下代码

导入 UIKit类 MasterViewController:UITableViewController、UISearchControllerDelegate、UISearchResultsUpdating、UISearchBarDelegate {var completeData = NSMutableArray()var nameData = NSMutableArray()覆盖 funcawakeFromNib() {super.awakeFromNib()}var searchController : UISearchController!覆盖 func viewDidLoad() {super.viewDidLoad()self.searchController = UISearchController(searchResultsController: nil)self.searchController.searchResultsUpdater = selfself.searchController.delegate = selfself.searchController.searchBar.delegate = selfself.searchController.hidesNavigationBarDuringPresentation = falseself.searchController.dimsBackgroundDuringPresentation = trueself.navigationItem.titleView = searchController.searchBarself.definesPresentationContext = true}var 标志 = 假var 任务:NSURLSessionTask!func updateSearchResultsForSearchController(searchController: UISearchController) {var inputText = searchController.searchBar.text 作为 NSString如果 inputText.length >3 {//TODO 按 %20 替换空间如果标志{task.cancel()}让 url = NSURL(string: "http://172.26.1.39:8080/ContactBook/search?term="+inputText);task = NSURLSession.sharedSession().dataTaskWithURL(url){(data, response, error) in如果(错误!= nil){println("一些错误")返回}var parseError: NSError?var jsonArray = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments, error: &parseError) as NSArray如果 parseError != nil {println("出了点问题")返回}self.completeData.removeAllObjects()self.nameData.removeAllObjects()var tempObject : NSDictionary;对于 var i=0;我<jsonArray.count;我++ {var jsonDict = jsonArray[i] 作为 NSDictionaryself.completeData.insertObject(jsonDict, atIndex: 0)var name = jsonDict.valueForKey("name")!作为 NSStringself.nameData.insertObject(name, atIndex: 0)让 indexPath = NSIndexPath(forRow: 0, inSection: 0)self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)}}标志 = 真任务.resume()}}覆盖 func didReceiveMemoryWarning() {super.didReceiveMemoryWarning()//处理任何可以重新创建的资源.}//标记: - 赛格覆盖 func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {如果 segue.identifier == "showDetail" {如果让 indexPath = self.tableView.indexPathForSelectedRow() {让 object = completeData[indexPath.row] 作为 NSDictionary(segue.destinationViewController 作为 DetailViewController).detailItem = object}}}//MARK: - 表格视图覆盖 func numberOfSectionsInTableView(tableView: UITableView) ->整数{返回 1}覆盖 func tableView(tableView: UITableView, numberOfRowsInSection 部分: Int) ->整数{返回 nameData.count}覆盖 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->UITableViewCell {let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell让 object = nameData[indexPath.row] 作为 NSStringcell.textLabel?.text = object.description返回单元格}覆盖 func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) ->布尔{//如果您不希望指定的项目可编辑,则返回 false.返回假}}

解决方案

错误信息很清楚,请阅读.引用:

<块引用>

由于未捕获的异常而终止应用'NSInternalInconsistencyException',原因:'无效更新:无效第 0 节中的行数.更新后的现有部分 (1) 必须等于更新前包含在该节中的行 (11),加上或减去从该部分插入或删除的行数(插入 1 个,0 已删除)并加上或减去移入或移出的行数该部分(0 移入,0 移出).

它说:

  • 更新(插入/删除)后,第 0 部分中有 1 个单元格,
  • 但是在你更新表格视图之前,你有 11 个单元格,然后你插入了 1 个单元格,因此它需要 11+1 个单元格,而不是 1

问题是 0 部分的单元格数量等于 nameData.count.还有你的代码(删除了不相关的部分)......

self.nameData.removeAllObjects() <----- (删除)var tempObject : NSDictionary;对于 var i=0;我<jsonArray.count;我++ {var jsonDict = jsonArray[i] 作为 NSDictionaryvar name = jsonDict.valueForKey("name")!作为 NSStringself.nameData.insertObject(name, atIndex: 0) <----- (插入)让 indexPath = NSIndexPath(forRow: 0, inSection: 0)self.tableView.insertRowsAtIndexPaths([indexPath],withRowAnimation: .Fade) <------(插入)}

... 从 self.nameData 中删除所有对象,但不会从表视图中删除.

表视图单元格和您的后备存储未同步.

重新加载数据

删除 self.tableView.insert... 行并将 self.tableView.reloadData() 放在 for 循环之后.它会重新加载整个表格视图.

self.nameData.removeAllObjects()var tempObject : NSDictionary;对于 var i=0;我<jsonArray.count;我++ {var jsonDict = jsonArray[i] 作为 NSDictionaryvar name = jsonDict.valueForKey("name")!作为 NSStringself.nameData.insertObject(name, atIndex: 0)让 indexPath = NSIndexPath(forRow: 0, inSection: 0)}self.tableView.reloadData()

或者只重新加载一个部分.

func reloadSections(_部分:NSIndexSet)

删除项目和然后插入

如果您不想重新加载所有单元格(整个表格视图),您必须记住,您的数据后备存储必须与表格视图保持同步.换句话说 - 如果您确实从表格视图中删除了单元格,则必须将其从您的后备存储中删除.如果您将单元格插入表格视图,则必须将其插入后备存储.反之亦然.

在您的情况下,您调用 self.nameData.removeAllObjects(),但您没有删除这些对象的表视图单元格.你应该打电话...

func deleteItemsAtIndexPaths(_ indexPaths: [NSIndexPath])

... 在 self.tableView 上,用于从 self.nameData 中删除的所有对象.

如果你做了很多 deleteItems.../insertItems/... 调用,最好将它们包装在 performBatchUpdates(_:completion:) 中:>

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

<块引用>

将多个插入、删除、重新加载和移动操作作为一个组进行动画处理.

I am getting json array response from particular url
On first request every thing is working fine but when second request goes then application crashes.

libsystem_kernel.dylib`__pthread_kill: 0x1082f885c: movl $0x2000148, %eax 0x1082f8861: movq %rcx, %r10 0x1082f8864: syscall 0x1082f8866: jae 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 Contact Book[15714:106637] * Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-3318/UITableView.m:1582 2015-07-16 13:44:37.341 Contact Book[15714:106637] * Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (1) must be equal to the number of rows contained in that section before the update (11), plus or minus the number of rows inserted or deleted from that section (1 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).' *** First throw call stack: ( 0 CoreFoundation 0x0000000105cd53f5 exceptionPreprocess + 165 1 libobjc.A.dylib 0x0000000107803bb7 objc_exception_throw + 45 2 CoreFoundation 0x0000000105cd525a +[NSException raise:format:arguments:] + 106 3 Foundation 0x000000010616c28f -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 195 4 UIKit 0x000000010663346a -[UITableView _endCellAnimationsWithContext:] + 11746 5 Contact Book 0x0000000105ae6a11 _TFFC12Contact_Book20MasterViewController38updateSearchResultsForSearchControllerFS0_FCSo18UISearchControllerT_U_FTGSQCSo6NSData_GSQCSo13NSURLResponse_GSQCSo7NSError__T_ + 2625 6 Contact Book 0x0000000105ae6bb3 _TTRXFo_oGSQCSo6NSData_oGSQCSo13NSURLResponse_oGSQCSo7NSError__dT__XFo_iTGSQS__GSQS0__GSQS1____iT + 51 7 Contact Book 0x0000000105ae4091 _TPA__TTRXFo_oGSQCSo6NSData_oGSQCSo13NSURLResponse_oGSQCSo7NSError__dT__XFo_iTGSQS__GSQS0__GSQS1____iT__ + 81 8 Contact Book 0x0000000105ae6e83 _TTRXFo_iTGSQCSo6NSData_GSQCSo13NSURLResponse_GSQCSo7NSError___iT__XFo_oGSQS__oGSQS0__oGSQS1___dT__ + 35 9 Contact Book 0x0000000105ae6f0f _TTRXFo_oGSQCSo6NSData_oGSQCSo13NSURLResponse_oGSQCSo7NSError__dT__XFdCb_dGSQS__dGSQS0__dGSQS1___dT__ + 127 10 CFNetwork 0x0000000108aaebbb 49-[__NSCFLocalSessionTask _task_onqueue_didFinish]_block_invoke + 157 11 Foundation 0x000000010618fccf __NSBLOCKOPERATION_IS_CALLING_OUT_TO_A_BLOCK + 7 12 Foundation 0x00000001060cfb32 -[NSBlockOperation main] + 98 13 Foundation 0x00000001060b2104 -[__NSOperationInternal _start:] + 645 14 Foundation 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: terminating with uncaught exception of type NSException (lldb)

I have following code

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
}
}

解决方案

It's pretty clear error message, just read it. Quote:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (1) must be equal to the number of rows contained in that section before the update (11), plus or minus the number of rows inserted or deleted from that section (1 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).

It says:

  • after the update (insert/delete) you've got 1 cell in section 0,
  • but before you did update the table view, you had 11 cells there, then you did insert 1 cell, thus it expects 11+1 cells, not 1

Problem is that number of cells in section 0 equals to nameData.count. And your code (removed unrelated parts) ...

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)
}

... removes all objects from self.nameData, but not from table view.

Table view cells and your backing store is not synced.

Reload Data

Remove self.tableView.insert... line and place self.tableView.reloadData() just after the for loop. It reloads the whole table view.

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()

Or reload just one section.

func reloadSections(_ sections: NSIndexSet)

Delete Items & Then Insert

If you do not want to reload all cells (whole table view), you must keep in mind that your backing store for data must be kept in sync with table view. In other words - if you do remove cell from table view, you must remove it from your backing store. If you do insert cell into table view, you must insert it into backing store. And vice versa.

In your case, you call self.nameData.removeAllObjects(), but you didn't delete table view cells for these objects. You should call ...

func deleteItemsAtIndexPaths(_ indexPaths: [NSIndexPath])

... on self.tableView for all objects you did remove from self.nameData.

If you do lot of deleteItems.../insertItems/... calls, it's good to wrap them in performBatchUpdates(_:completion:):

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

Animates multiple insert, delete, reload, and move operations as a group.

这篇关于__pthread_kill 第二次请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆