如何将Swift数组作为参数传递给线程?

时间:2014-09-12 01:01:50

标签: arrays multithreading oop swift

我正在尝试生成一个新线程来进行一些后台处理,基于我已经分解成一个字符数组的String。这是我的代码的样子:

   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”。

没有为我的数组编写一个对象包装器,或者将它设置为一个实例变量(两者看起来都有点过分),有什么方法可以将这个数组传递给新的线程吗?

2 个答案:

答案 0 :(得分: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 Dispatch以及它在Apple Concurrency Programming Guide中提供线程和并发性时提供的所有好处。

答案 1 :(得分:0)

根本原因是detachNewThreadSelector只能接受NSMutableArray参数的withObject。如果使testStringArrayNSMutableArray类型的变量,则可以删除编译器错误消息。

话虽如此,你应该认真考虑Bryan Chen和Mike S的建议,转而使用GCD。