从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]; 

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

  1. 您不能在辅助线程上更新UI。
  2. 可变类不是线程安全的。 ([myArray count]){ NSString * string = [myArray objectAt(0)]; [self performSelectorOnMainThread:@selector(displayString :) withObject:string waitUntilDone:NO]; [myArray removeObjectAt(0); }