Javascript 只能从主线程调用目标c
我试图从javascript中使用的回调方法调用委托。但是,当我从回调执行委托时,而不是在事件触发时,我得到了错误Javascript 只能从主线程调用目标c,javascript,ios,objective-c,react-native,Javascript,Ios,Objective C,React Native,我试图从javascript中使用的回调方法调用委托。但是,当我从回调执行委托时,而不是在事件触发时,我得到了错误“只能从主线程调用” 注意:错误在代码的最后一行 下面是代码的样子 RCT_EXPORT_METHOD(setBold) { if(_bold == NO) { _bold = YES; } else if (_bold == YES) { _bold = NO; } else{ _bold = NO; } if(_te
“只能从主线程调用”
注意:错误在代码的最后一行
下面是代码的样子
RCT_EXPORT_METHOD(setBold) {
if(_bold == NO)
{
_bold = YES;
}
else if (_bold == YES)
{
_bold = NO;
}
else{
_bold = NO;
}
if(_textV!=nil)
{
_delCalled = YES;
[self textViewDidChangeSelection:_textV];
}
}
-(void)textViewDidChangeSelection:(UITextView *)textView
{
_textV = textView;
_selectedText = [textView.text substringWithRange:textView.selectedRange];
_rangeStart = textView.selectedRange.location;
_rangeEnd = textView.selectedRange.length;
if(_delCalled == YES)
{
[self applyBold:textView];
_delCalled = NO;
}
NSDictionary *event = @{
@"target": textView.reactTag,
@"highlights": @{
@"text": textView.text,
@"range": @(textView.selectedRange.length),
@"cursorPosition": @(textView.selectedRange.location),
@"eventType": @"textViewDidChangeSelection",
}
};
[self.bridge.eventDispatcher sendInputEventWithName:@"topChange" body:event];
}
-(void)applyBold:(UITextView *)textView
{
NSMutableAttributedString *formatString;
UIFont* boldFont;
NSString *selectedText = _selectedText;
_rangeStart -=1;
if(_rangeEnd == 0)
{
_rangeEnd = 1;
}
else
{
_rangeStart +=1;
}
NSRange range = NSMakeRange(_rangeStart, _rangeEnd);
if (_bold==YES) {
boldFont= [UIFont boldSystemFontOfSize:[UIFont systemFontSize]];
}
else{
boldFont= [UIFont systemFontOfSize:textView.font.pointSize];
}
NSAttributedString *lem = textView.attributedText;
NSMutableAttributedString *textViewText = [[NSMutableAttributedString alloc]initWithAttributedString:textView.attributedText];
NSDictionary *boldAttr = [NSDictionary dictionaryWithObject:boldFont forKey:NSFontAttributeName];
formatString = [[NSMutableAttributedString alloc]initWithString:selectedText attributes:boldAttr];
if(![selectedText isEqual:@""] || ![selectedText isEqual:@" "])
{
[textViewText replaceCharactersInRange:range withAttributedString:formatString];
//this is where the error happens
textView.attributedText = textViewText;
}
}
将生成错误的行括在与主队列异步的调度中
dispatch_async(dispatch_get_main_queue(), ^{
...
});
在iOS中,任何更新UI的方法都必须在主线程上调用。iOS UIKit不是线程安全的。因此,解决方案是将代码放在主线程上,如下所示
dispatch_async( dispatch_get_main_queue(), ^{
textView.attributedText = textViewText;
});
谢谢你把它修好了。