IOS - 在Web服务调用期间停止线程

时间:2014-02-03 14:07:35

标签: ios multithreading macos

我正在运行一个包含多个线程的应用程序。我的应用程序有一组队列对象(简单的数组)。线程的输入将来自此队列。每个线程都将获取一个队列对象作为输入。我正在以下面的简单方式创建和启动此线程。

threadOne = [[NSThread alloc] initWithTarget:self
                                                  selector:@selector(initThread:)
                                                    object:nil];
[threadOne main];

同样,我为每个对象启动多个可用线程。

当我在webservice调用期间以调试模式运行我的应用程序时,我当前运行的线程不等待响应(大约我的webservice调用将花费2-3秒来生成响应)。这里我的队列进程因Web服务调用而停止。 以下是供参考的代码。

dispatch_sync(dispatch_get_main_queue(), ^{

        [service genID:self action:@selector(genHandler:) username: username password:password ];

    });

我想在我的应用程序中并行运行多个线程。有没有解决办法来实现上述目标。

1 个答案:

答案 0 :(得分:1)

你可能有一个死锁,因为你正在调用

dispatch_sync(dispatch_get_main_queue()

来自主线程。您可以在this answer找到一个很好的解释。

作为旁注,我建议使用NSOperationQueue或Grand Central Dispatch,因为Apple does not recommend直接使用NSThread对象:

  

过去,将并发引入应用程序需要创建一个或多个其他线程。不幸的是,编写线程代码很有挑战性线程是一种必须手动管理的低级工具。鉴于应用程序的最佳线程数可以根据当前系统负载和底层硬件动态变化,实现正确的线程解决方案变得非常困难,即使不是不可能实现。此外,通常与线程一起使用的同步机制会增加软件设计的复杂性和风险,而不会保证性能的提高。

     

与基于线程的系统和应用程序中传统的操作相比,OS X和iOS都采用了更加异步的并发任务执行方法。应用程序只需定义特定任务,然后让系统执行它们,而不是直接创建线程。通过让系统管理线程,应用程序获得了原始线程无法实现的可伸缩性级别。应用程序开发人员还可以获得更简单,更高效的编程模型。