【问题标题】:bool _WebTryThreadLock(bool) crash with UITableViewbool _WebTryThreadLock(bool) 与 UITableView 崩溃
【发布时间】:2013-01-03 10:03:57
【问题描述】:

我正在尝试在UITableView 中显示推文。

代码:-

- (void)requestTimeline:(int)count
{    
    NSURL *url = [NSURL URLWithString:@"http://api.twitter.com/1/statuses/user_timeline.json"];

    NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init];
    [parameters setObject:@"abc" forKey:@"screen_name"];
    [parameters setObject:@"20" forKey:@"count"];
    [parameters setObject:@"1" forKey:@"include_entities"];

    TWRequest *request = [[TWRequest alloc] initWithURL:url parameters:parameters requestMethod:TWRequestMethodGET];

    [request performRequestWithHandler:^(NSData *responseData1, NSHTTPURLResponse *urlResponse, NSError *error)
    {
        if (responseData1 != nil)
        {
            NSError *error = nil;
            self.itemsToDisplay = [NSJSONSerialization JSONObjectWithData:responseData1 options:NSJSONReadingMutableLeaves error:&error];

            if (self.itemsToDisplay != nil)
            {
                [self.tableView reloadData];
            }
            else
            {
                NSLog(@"Error serializing response data %@ with user info %@.", error, error.userInfo);
            }
        }
        else
        {
            NSLog(@"Error requesting timeline %@ with user info %@.", error, error.userInfo);
        }
    }];
}

selfUITableViewController 的子类。

由于阻塞,twitter请求将在另一个线程上执行,而不是在主线程上。这就是它崩溃的原因。

//TWRequest.h

// Issue the request. This block is not guaranteed to be called on any particular thread.
- (void)performRequestWithHandler:(TWRequestHandler)handler;

崩溃报告:-

bool _WebTryThreadLock(bool), 0xa8e4f50: 试图获取网络锁 来自除主线程或网络线程之外的线程。这可能 是从辅助线程调用 UIKit 的结果。崩溃 现在...

如何解决这个问题?

谢谢...

【问题讨论】:

  • 你是否尝试在主线程上执行reloadData
  • 是的,我做了,但没用...
  • 不,你没有,因为他的代码是错误的。它会有所帮助:)

标签: iphone objective-c ios uitableview


【解决方案1】:

网页视图只能在主线程中使用。大部分 UIKit —— tableView reloadData 命令也不是线程安全的

dispatch_async(dispatch_get_main_queue(), ^{ 
    //all you ever do with UIKit.. in your case the reloadData call
    [self.tableView reloadData];
});

【讨论】:

    【解决方案2】:

    已解决:

    下面的代码也有效:

    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                                    [self.tableView reloadData];
                                }];
    

    【讨论】:

    • yip,这就是使用 GCD 的 ObjC 变体(NSOperation 今天是在 GCD 之上实现的……更喜欢 C 调度 api,但这是一个品味问题: D
    【解决方案3】:

    试试:

    [self.tableView performSelectorInMainThread:@selector(reloadData)];
    

    代替:

    [self.tableView reloadData];
    

    【讨论】:

      【解决方案4】:

      插入这个,可能有帮助:

      [self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
      

      【讨论】:

      • 错误代码 - 执行应该在 tableView 上,而不是在自己上。另外我会使用一个块..它的方式更灵活。 *不是在这种情况下,而是在一般情况下!)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-07
      • 2023-04-11
      • 2011-08-19
      • 1970-01-01
      相关资源
      最近更新 更多