2013-07-19 72 views
2

我正在做一些使用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留在家中,而且我正在工作。 任何建議/幫助將不勝感激

回答

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]; 
} 
1

爲了解決您的第一關注,[string substringWithRange:NSMakeRange(5, string.length - 6)]應該是足夠的,沒有任何問題,應該工作。您可以使用NSRegularExpression來匹配標籤內的內容,但這對於這樣一個簡單的任務來說可能是過度的(並且會有性能問題)。

其次,UIKit的方法,只能從主線程調用(見documentation):

注意:在大多數情況下,UIKit類應該只從應用程序的主線程中使用。對於派生自UIResponder的類或者以任何方式涉及操縱應用程序用戶界面的類尤其如此。

您似乎是在另一個線程中設置標籤的文本。這是導致崩潰的原因。你需要打電話給你displayString:方法是這樣的:

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

這將執行在主線程,而不是在後臺線程的方法。

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