我将UITableViewCell子类化并使用PureLayout来应用约束,但应用程序终止时出现错误“PureLayout不是线程安全的,必须专门从主线程使用”。
在函数中......
initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
我刚应用了一个约束
[self.label autoSetDimension:ALDimensionHeight toSize:50];
删除后,应用程序不会崩溃
更新--- 这可能是因为我异步调用API
答案 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];
...
}