PureLayout不是线程安全的

时间:2016-05-03 20:23:03

标签: ios autolayout pure-layout

我将UITableViewCell子类化并使用PureLayout来应用约束,但应用程序终止时出现错误“PureLayout不是线程安全的,必须专门从主线程使用”。

在函数中......

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

我刚应用了一个约束

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

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

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

2 个答案:

答案 0 :(得分:2)

将您的初始化呼叫包裹在dispatch_async主线程中,然后......

无需查看其余代码。

dispatch_async(dispatch_get_main_queue(), ^{

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

    });

但是如果你需要这样做,我怀疑你是以错误的方式做事。您应该做的是使用异步调用的结果更新数据并在tableview上调用reloadData

像...一样的东西。

[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];

        });

    }];

答案 1 :(得分:1)

请勿尝试在未在主线程上运行的函数内更改UI。

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

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

错误:

function fuelListClick(obj) {
    fuel_weight = $(obj).text();
    fuel_moment = $(obj).data("fuel_moment");
    console.log("fuel_weight:" + fuel_weight);
    console.log("fuel_moment:" + fuel_moment);
}

正确:

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