从NSString中提取线程的子串
我正在做一些使用iOS的RedPark串行线的工作。这是一种允许iOS设备与其他设备(如微控制器)进行串行通信的电缆。从NSString中提取线程的子串
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);
}
}
我相信它的崩溃围绕上述... [自我displayString:字符串]只设置了一个标签的价值,像
-(void)displayString(NSString *string) {
label.text = [string charAt(1)];
}
上面的代码只是从记忆中,因为我已将我的Mac留在家中,而且我正在工作。 任何建议/帮助将不胜感激
而不是
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];
}
为了解决您的第一关注,[string substringWithRange:NSMakeRange(5, string.length - 6)]
应该是足够的,没有任何问题,应该工作。您可以使用NSRegularExpression
来匹配标签内的内容,但这对于这样一个简单的任务来说可能是过度的(并且会有性能问题)。
其次,UIKit的方法,只能从主线程调用(见documentation):
注意:在大多数情况下,UIKit类应该只从应用程序的主线程中使用。对于派生自
UIResponder
的类或者以任何方式涉及操纵应用程序用户界面的类尤其如此。
您似乎是在另一个线程中设置标签的文本。这是导致崩溃的原因。你需要打电话给你displayString:
方法是这样的:
[self performSelectorOnMainThread:@selector(displayString:) withObject:string waitUntilDone:YES];
这将执行在主线程,而不是在后台线程的方法。
- 您不能在辅助线程上更新UI。
可变类不是线程安全的。 ([myArray count]){ NSString * string = [myArray objectAt(0)]; [self performSelectorOnMainThread:@selector(displayString :) withObject:string waitUntilDone:NO]; [myArray removeObjectAt(0); }