【问题标题】:How can I pass a Swift array as an argument to a thread?如何将 Swift 数组作为参数传递给线程?
【发布时间】:2014-09-12 01:01:49
【问题描述】:

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

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

没有为我的数组编写一个对象包装器,或者将它设置为一个实例变量(这两者似乎都过大了),有什么办法可以让这个数组传递给新线程?

【问题讨论】:

  • 使用 GCD dispatch_async

标签: arrays multithreading oop swift


【解决方案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
}

您可以在 Apple 的 Concurrency Programming Guide 中阅读 Grand Central Dispatch 以及它在线程和并发方面提供的所有优点。

【讨论】:

    【解决方案2】:

    根本原因是detachNewThreadSelector 对于withObject 参数只能接受NSMutableArray。如果您将testStringArray 设为NSMutableArray 类型的变量,您可以摆脱编译器错误消息。

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

    【讨论】:

    • 我试过了……但是 NSMutableArray 的元素必须是对象,而 Swift 类型的 Character 不是对象。所以这只是意味着我需要为每个字符提供一个对象包装器,而不是为数组提供一个对象包装器。
    猜你喜欢
    • 2022-11-25
    • 2020-11-14
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 2018-04-17
    • 2011-02-18
    相关资源
    最近更新 更多