2014-09-12 5 views
0

Я пытаюсь создать новый поток, чтобы выполнить некоторую фоновую обработку на основе строки, которую я разбил на массив символов. Вот что мой код выглядит следующим образом:Как передать массив Swift в качестве аргумента в поток?

var testString : String = NSString(data:data!, encoding:NSUTF8StringEncoding) 
    var testStringArray : Array<Character> = [] 

    for character in testString 
    { 
     if(!(self.isCharacterStrippable(character))) 
     { 
      testStringArray.append(character) 
     } 
    } 

    NSThread.detachNewThreadSelector("fillKeysFromArray:", toTarget: self, withObject: testStringArray) 

Я получаю ошибку компиляции, говоря мне, что «Массив не соответствует протоколу AnyObject».

Недостаточно написания обертки объекта для моего массива или установки его как переменной экземпляра (оба из которых кажутся излишними), есть ли способ передать этот массив в новый поток?

+1

use GCD dispatch_async –

ответ

1

Использование Grand Central Dispatch будет намного проще в долгосрочной перспективе. Вы можете запустить функцию на фоне потока с чем-то вроде:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) { 
    [weak self] in // This is so that we don't create a reference cycle 
    self?.fillKeysFromArray(testStringArray); 
    return 
} 

Вы можете прочитать на Диспетчер Grand Central и все хорошие вещи, которые она предоставляет, когда речь заходит о многопоточности и параллелизм в компании Apple Concurrency Programming Guide.

+0

Thanks; работал как сон. – chapka

0

Основной причиной является то, что detachNewThreadSelector может принимать только NSMutableArray для параметра withObject. Если вы сделаете testStringArray переменной типа NSMutableArray, вы можете избавиться от сообщения об ошибке компилятора.

Сказав это, вы должны серьезно рассмотреть советы Брайана Чена и Майка С. перейти к GCD.

+0

Я пробовал это ... но элементы NSMutableArray должны быть объектами, а символ типа Swift не является объектом. Так что просто означает, что мне понадобится обертка объекта для каждого символа вместо одного для массива. – chapka

Смежные вопросы