Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS中的主线程实现_Ios_Objective C - Fatal编程技术网

iOS中的主线程实现

iOS中的主线程实现,ios,objective-c,Ios,Objective C,我正在用objective C(iOS)做一些事情,但陷入了崩溃,这种情况有时只会发生。这是我的代码(当txn完成时,它在一个被调用的块中) callSomeMethod如下所示 - (void) callSomeMethod`{ dispatch_async(dispatch_get_main_queue(), ^{ //reload tableview here [self.tableView reloadSections:[NSIndexSet indexSetWithIn

我正在用objective C(iOS)做一些事情,但陷入了崩溃,这种情况有时只会发生。这是我的代码(当txn完成时,它在一个被调用的块中)

callSomeMethod如下所示

- (void) callSomeMethod`{
dispatch_async(dispatch_get_main_queue(), ^{
    //reload tableview here
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic] ;
}) ;
}
我的问题是: 1.在主线程内调用主线程可以吗,因为我在这里调用一个方法callsomethod,然后在该方法内调用另一个主线程

  • 当我的表视图忙于重新加载节0时,响应再次出现,myArray的内容已更改,因此应用程序正在崩溃
  • 感谢您的帮助

    非常感谢

    编辑: 我的确切要求是。 1.有多个部分 2.可以上下移动节 3.具有多个频繁更新的TXN,我需要相应地更新tableview
    4.当我从服务器获得响应并且正在更改数据源数组的内容时,重新加载tableview部分

    是的,可以再次调用dispatch\u async到主队列。但是,请记住dispatch_async的作用。由于它是异步执行的,
    callsomethod
    将不会在与第一个dispatch\u异步调用相同的执行流中出现。至于崩溃,
    callSomeMethod
    是否需要将异步调度到主队列?这可能有助于删除
    callsomethod
    中的dispatch\u async,只需确保调用
    callsomethod
    的人在主线程上执行该操作。

    使用
    dispatch\u sync
    从主线程同步启动到主线程将停止应用程序。使用
    dispatch\u async
    对任何线程都是安全的


    如果在表加载单元格时更新表数据时遇到问题,则必须阻止这种情况发生。将数据存储在其他位置,并且仅在完全更新后调用
    重新加载数据。

    在更新要执行数据更新的数据后异步调用表更新可能会很危险

    在您的示例中,您基本上是在执行以下操作:
    1)
    myArray=[[NSMutableArray alloc]initWithArray:someOtherArray]
    2) 异步调度到main
    3)
    [self.tableView重新加载节:[NSIndexSet indexetwithindex:0]带RowAnimation:UITableViewRowAnimationAutomatic]

    比如说,不久之后,您尝试了以下操作:
    4)
    [myArray insertObject:newObject-atIndex:0]
    5) 异步调度到main
    6)
    [self.tableView insertRowsAtIndexPaths:@[[nsindepath indexPathForRow:0第1部分:0]]带行动画:UITableViewRowAnimationAutomatic]

    在上面的示例中,您需要3)发生在1)之后,而不是4)之后。如果3)发生在4)之后,3)的刷新将导致所需的刷新以及行插入。当点击6)时,它将尝试插入一行已经插入的内容,应用程序将崩溃

    由于您的异步调度在2)和5)上,因此上述场景可能会发生,其中3)可以在4)之后被调用


    要解决此问题,请消除数据更新和表刷新之间的异步调度。在上面的示例中,这将涉及删除2),以及任何其他类似的实例,例如5)。

    非常感谢您的回复。是否有其他方法确保callSomeMethod在主线程上运行。我尝试检查[NSThread currentThread],但发现dispatch_async更合适。NSThread有一个名为
    isMainThread
    的类方法,它返回BOOLThanks Ian,我只使用dispatch_async,但看起来myArray的内容在调用reloadData方法的过程中以及在对所有可见行执行tableview数据源方法之前都发生了更改。我可能错了。在接收完数据之前,不要调用
    reloadData
    。谢谢,但在我的应用程序中,响应可以随时出现。有多个后台线程正在为不同目的更新同一数组。我需要根据响应更新UITableView。然后使用第二个数组,仅在更新完成后交换它。如果必须,请将表视图的委托和数据源设置为
    nil
    。是否可以发布崩溃日志,错误消息是什么?还有什么原因需要在callSomeMethod中使用另一个dispatch_async?尝试删除调度\u async。一个可能的问题是您更改了tableView的数据源,在更新内容之前,tableView尝试引用旧数据,这将导致问题。在-[UITableView\u endCellAnimationsWithContext:]、/SourceCache/UIKit\u Sim/UIKit-1914.84/UITableView.m:1037中的断言失败,这是我在崩溃时得到的类似日志。(该死,现在没有崩溃)我还注意到,这个日志的最后一部分(UITableView.m:1037)中的数字与我的日志不同。你提到的最后一行是对的。我更新了我的问题。你好,本,谢谢你的回答。我试过了,效果很好。但由于我的应用程序有时只会崩溃(比如40次尝试中有一次崩溃)。谢谢:)没问题!如果有什么我可以帮你解决剩下的问题,请告诉我。另外,如果你认为我的答案已经解决了你目前提出的问题,别忘了将我的答案标记为正确!
    - (void) callSomeMethod`{
    dispatch_async(dispatch_get_main_queue(), ^{
        //reload tableview here
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic] ;
    }) ;
    }