【问题标题】:Using NSOperation for threading creates too many objects使用 NSOperation 进行线程处理会创建太多对象
【发布时间】:2009-08-19 14:36:19
【问题描述】:

我有一个进行 SOAP 调用的应用程序。为了防止 UI 阻塞,我们将每个 SOAP 调用放入 NSOperation 的子类中。这很好用,但是我们有大量不同类型的 SOAP 调用。因此,如果我们使用 3 个 WSDL,每个 WSDL 有 10 个端口或操作,那么我们在 SOAP 中有 30 个不同的调用,如果我们使用 NSOperation 将每个调用放在一个线程中,我们最终会得到 30 个 NSOperation 子类。

这可能不是一件坏事,但我们正在尝试创建一个可重用的库,因此每个 WSDL 都有一个对象来封装调用。这很好,因为我们使用的是 WSDL2ObjC,它封装了所有逻辑。但是在这么多的 NSOperations 中有一个很好的 api 来包装调用似乎很奇怪。此外,我们正在 api 本身中进行线程化,以便调用者可以按照他/她认为合适的方式使用它。

任何建议都会很棒。

【问题讨论】:

    标签: iphone cocoa cocoa-touch multithreading nsoperation


    【解决方案1】:

    如果我对您的理解正确,您已经拥有封装对 SOAP 服务的调用的对象,而您只想减少 NSOperation 子类。

    你检查过 NSInvocationOperation 吗?它是 NSOperation 的子类,可让您将消息作为 NSOperation 调用发送到对象。所以你仍然可以获得非阻塞操作,但你不需要多个 NSOperation 子类。

    【讨论】:

    • 我做到了。我希望使用该操作在完成时发送通知。也许我可以将通知添加到 api,这就是检索返回值的方式,但这似乎是一个糟糕的设计。我会考虑更多,看看这是否可行。我会继续努力,看看我能想出什么。谢谢。
    • NSIvocationOperation 的问题是它只允许你传递一个对象。是否有解决方法或某种动态绑定我可以解决这个问题?
    • 我能想到的解决一个对象问题的最好方法就是制作另一个可以容纳您需要传递的所有东西的对象。我将不得不考虑得到通知的部分。您的所有 WSDL 对象都具有几乎相同的方法吗?
    • 我最终创建了一个 NSInvocation 对象(对我来说是新的),您可以使用选择器、目标以及任何和所有参数设置该对象。然后你使用 NSInvocationOperation initWithInvocation: 并给它你的调用对象。然后,我在我的 api 中为每个方法创建了 2 个副本——身份验证和 thread_authenticate。这个想法是,如果从线程调用并且您不能有返回值,则调用 _thread 方法,该方法基本上调用普通方法,并执行返回所需的操作并将其转换为通知。感谢您为我指明这条路。
    • Incase NSInvocation 对你来说是新的 - 一个例子:theocacao.com/document.page/264
    猜你喜欢
    • 2014-03-25
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 2016-11-30
    • 2019-02-27
    相关资源
    最近更新 更多