0

我将 UITableViewCell 子类化并使用 PureLayout 来应用约束,但应用程序以错误“PureLayout 不是线程安全的,必须从主线程中独占使用”而终止。

在函数...

 initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 

我刚刚应用了一个约束

[self.label autoSetDimension:ALDimensionHeight toSize:50];

删除后,应用程序不会崩溃

更新---这可能是因为我正在异步调用 API

4

2 回答 2

1

然后将您的 init 调用包装dispatch_async到主线程中......

没有看到你的代码的其余部分。

dispatch_async(dispatch_get_main_queue(), ^{

        UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Something"];

    });

但是如果你需要这样做,我怀疑你做错了事情。您应该做的是使用异步调用的结果更新数据并调用reloadDatatableview。

就像是...

[SomeAPI loadSomeRemoteDataPleaseWithCompetion:^(NSArray *theNewData){

        self.dataArray = theNewData;
        //oh hai im a bad API and dont return in main thread
        dispatch_async(dispatch_get_main_queue(), ^{

            [self.tableview reloadData];

        });

    }];
于 2016-05-03T21:02:57.853 回答
1

不要尝试在不在主线程上运行的函数中更改 UI。

您正在尝试更改 init 内的标签约束,这就是您的问题:您不在主线程中。

要解决此问题,请在单元格的 awakeFromNib 函数中添加更改 UI 的行,而不是在 init 函数中。

错误的:

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    ...
    [self.label autoSetDimension:ALDimensionHeight toSize:50];
    ...       
}

正确的:

- (void)awakeFromNib {
    [super awakeFromNib];

    ...
    [self.label autoSetDimension:ALDimensionHeight toSize:50];
    ...
}
于 2019-11-29T17:43:19.937 回答