"从后台线程修改自动布局引擎"在UITableViewCell中

时间:2016-09-25 07:57:03

标签: objective-c multithreading autolayout grand-central-dispatch

为了在我的UITableViewCell中流畅地下载和显示图像,我实现了以下内容:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *thisCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (_movieCell == nil) {
        thisCell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }


    Movie* thisMovie = [_movies objectAtIndex:indexPath.row];
    thisCell.imageView.image = nil;
    thisCell.textLabel.text =thisMovie.Title;
    thisCell.imageView.image=[UIImage imageNamed:@"Dummy"];
    thisCell.detailTextLabel.text = thisMovie.Year;



    NSURL * imageURL = [NSURL URLWithString:[thisMovie.Poster stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];


    NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithURL:imageURL completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (data) {

            UIImage *image = [UIImage imageWithData:data];
            if (image) {
                dispatch_async(dispatch_get_main_queue(), ^{
                    UITableViewCell *updateCell = (id)[tableView cellForRowAtIndexPath:indexPath];
                    if (updateCell)
                        updateCell.imageView.image = image;
                    //[updateCell setNeedsLayout];

                });
            }
        }

    }];
    [task resume];

    return thisCell;
}

这一切都运行良好,除了事实,在至少执行代码的可见部分几秒后,调试控制台告诉我

  

此应用程序正在从后台修改autolayout引擎   从主线程访问引擎后的线程。

这是一个非常简单的应用程序的一部分,它没有任何其他背景内容,所以我认为正是这部分代码导致了这个问题。

有人能告诉我我的代码中的错误,或者,解释一种调试/跟踪后台线程的方法吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

所以,我应该点击相关问题。 first Related提供了一种很好的调试方法。