Поток, извлекающий подстроку из NSString

Я делаю некоторую работу, используя последовательный кабель RedPark для iOS. Это кабель, который обеспечивает последовательную связь между устройством iOS и другим устройством, таким как микроконтроллер.

В SDK RedPark есть метод, который считывает байты, доступные на последовательной линии. Этот метод вызывается каждый раз, когда кабель получает информацию.

(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 дома и нахожусь на работе. Любые предложения/помощь будут оценены


person David Evans    schedule 19.07.2013    source источник


Ответы (3)


Вместо

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];
}
person stosha    schedule 19.07.2013

Чтобы решить вашу первую проблему, [string substringWithRange:NSMakeRange(5, string.length - 6)] должно быть достаточно, и он должен работать без каких-либо проблем. Вы можете использовать NSRegularExpression для сопоставления содержимого внутри тегов, но это будет излишним для такой простой задачи (и приведет к снижению производительности).

Во-вторых, методы UIKit должны вызываться только из основного потока (см. документация):

Примечание. В большинстве случаев классы UIKit следует использовать только в основном потоке приложения. Это особенно верно для классов, производных от UIResponder, или для тех, которые каким-либо образом манипулируют пользовательским интерфейсом вашего приложения.

Похоже, вы устанавливаете текст метки в другом потоке. Это и является причиной сбоя. Вам нужно вызвать свой метод displayString: следующим образом:

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

Это выполнит метод в основном потоке, а не в фоновом потоке.

person Greg    schedule 19.07.2013

  1. Вы не должны обновлять пользовательский интерфейс во вторичном потоке.
  2. Изменяемые классы не являются потокобезопасными.

    while([myArray count]){ NSString *string = [myArray objectAt(0)]; [самостоятельно выполнитьSelectorOnMainThread:@selector(displayString:) withObject:string waitUntilDone:NO]; [мой массив removeObjectAt (0); }

person Parag Bafna    schedule 19.07.2013