Javascript 只能从主线程调用目标c

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

我试图从javascript中使用的回调方法调用委托。但是,当我从回调执行委托时,而不是在事件触发时,我得到了错误
“只能从主线程调用”

注意:错误在代码的最后一行

下面是代码的样子

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;
});

谢谢你把它修好了。