2

我正在使用适用于 iOS 的 RedPark 串行电缆做一些工作。这是一条允许 iOS 设备和其他设备(如微控制器)之间进行串行通信的电缆。

RedPark SDK 附带了一种读取串行线路上可用字节的方法。只要电缆接收到信息,就会调用此方法。

(void)readDataBytes(UInt32 bytes) {
   NSString *s = [[NSString alloc] initWith...bytes];
   NSString *editedString = [self extractSubStringMethod:s];
   [myArray addObject:editedString];
}

微控制器正在以以下格式发送信息

<msg>xxxxxxxxxxxxx</msg>

我希望能够从消息中提取 x(作为 NSString 接收)。目前我正在使用 NSRange 提取位置 4(第一个 x)之后和最后一个“< /msg>”之前的所有内容,我不相信它有效,想知道还有其他想法吗?

最后,我有一个与它一起运行的 NSThread,我将消息添加到 NSMutableArray。所以我想要的是,当从电缆接收到消息时,NSThread 将处理/显示消息信息。我有类似以下的东西

//Thread method, 
while([myArray count] > 0) //Don't believe this is neccesary but its in anyway
{
  for(int i = 0; i < [myArray count]; i++){
    NSString *string = [myArray objectAt(i)];
    [self displayString:string];
    [myArray removeObjectAt(i);
    }
}

我相信它在上面崩溃了...... [self displayString:string] 只是设置标签的值,比如

-(void)displayString(NSString *string) {
 label.text = [string charAt(1)];
}

上面的代码只是记忆中的,因为我把我的 Mac 留在家里并且正在工作。任何建议/帮助将不胜感激

4

3 回答 3

1

代替

while([myArray count] > 0) //Don't believe this is neccesary but its in anyway
{
  for(int i = 0; i < [myArray count]; i++){
    NSString *string = [myArray objectAt(i)];
    [self displayString:string];
    [myArray removeObjectAt(i);
    }
}

试试这样:

while ([myArray count] > 0)
{
    [self displayString: myArray[0]];        
    [myArray removeObjectAtIndex: 0];
}
于 2013-07-19T08:57:00.037 回答
1

为了解决您的第一个问题,[string substringWithRange:NSMakeRange(5, string.length - 6)]应该足够并且应该可以正常工作。您可以使用 anNSRegularExpression来匹配标签内的内容,但这对于如此简单的任务来说太过分了(并且会影响性​​能)。

其次,UIKit 方法只能从主线程调用(参见文档):

注意:在大多数情况下,UIKit 类只能在应用程序的主线程中使用。UIResponder对于派生自或涉及以任何方式操作应用程序用户界面的类来说尤其如此。

您似乎在不同的线程中设置标签的文本。这就是导致崩溃的原因。您需要displayString:像这样调用您的方法:

[self performSelectorOnMainThread:@selector(displayString:) withObject:string waitUntilDone:YES];

这将在主线程而不是后台线程上执行该方法。

于 2013-07-19T08:57:08.027 回答
1
  1. 您不得在辅助线程上更新 UI。
  2. 可变类不是线程安全的。

    while([myArray count]){ NSString *string = [myArray objectAt(0)]; [self performSelectorOnMainThread:@selector(displayString:) withObject:string waitUntilDone:NO]; [myArray removeObjectAt(0); }

于 2013-07-19T09:06:43.127 回答