- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我知道如果我创建一个 NSURLConnection(标准异步连接),它将在同一个线程上回调。目前这是在我的主线程上。 (工作也很好)。
但我现在使用相同的代码做其他事情,我需要保持我的 UI 活泼....
如果我这样做
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
/* and inside here, at some NSURLConnection is created */
});
.. 是否有可能我的 NSURLConnection 已创建但我的线程在 url 连接返回之前就消失了?
我是 GCD 的新手。在我的 url 连接返回之前,如何让线程保持事件状态,或者是否有更好的方法可以做到这一点?
最佳答案
因此,真正的问题不在于您的 block 在其上运行的线程的生命周期,而是该特定线程不会配置运行循环以接收从连接返回的任何事件的事实。
那怎么解决呢?有不同的选择可供考虑。我可以列出一些,我相信其他人会列出更多。
1 - 您可以在此处使用同步连接。一个缺点是您不会获得身份验证、重定向、缓存等的回调。(同步连接的所有常见缺点。)另外,每个连接当然会在一段时间内阻塞一个线程,所以如果您正在做如果其中有很多,那么您可能会同时阻塞几个线程,这很昂贵。
2 - 如果您的连接很简单并且您使用的是 iOS5,那么您可以使用此方法:
+ (void)sendAsynchronousRequest:(NSURLRequest *)request
queue:(NSOperationQueue*) queue
completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))
这将启动一个异步连接,然后允许您指定一个完成处理程序(用于成功或失败)和您希望在其上安排该 block 的 NSOperationQueue。
同样,您的缺点是无法获得身份验证、缓存等可能需要的回调。但至少您不会让正在运行的连接阻塞线程。
3 - iOS5 的另一个选项是为所有委托(delegate)回调设置队列:
- (void)setDelegateQueue:(NSOperationQueue*) 队列 NS_AVAILABLE(10_7, 5_0);
如果你使用它,那么所有的委托(delegate)方法都将在你指定的任何 NSOperationQueue 的上下文中执行。所以这类似于选项 #2,期望您现在获得所有委托(delegate)方法来处理身份验证、重定向等。
4 - 您可以设置您自己的线程,您可以专门控制这些线程来管理这些连接。在设置该线程时,您适本地配置了一个运行循环。这在 iOS4 和 5 中会很好地工作,并且显然会为您提供您想要处理的所有委托(delegate)回调
5 - 您可能会考虑异步连接处理的哪些部分真正干扰了您的用户界面。通常启动连接或接收委托(delegate)回调并不昂贵。昂贵的(或不确定的)成本通常是在处理您最后收集的数据时产生的。这里要问的问题是,您是否真的通过在某个队列上安排一个 block 来启动异步连接来节省时间,该连接将立即关闭并在另一个线程上执行它的操作?
因此您可以从主线程启动连接,并在主线程上接收所有委托(delegate)回调,然后在这些委托(delegate)方法的实现中触发您需要的任何昂贵的工作在其他队列或线程上执行。
所以像这样:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
// go ahead and receive this message on the main thread
// but then turn around and fire off a block to do the real expensive work
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Parse the data we've been collecting
});
}
同样,这并不全面。有很多方法可以处理这个问题,具体取决于您在此处的具体需求。但我希望这些想法有所帮助。
关于objective-c - GCD 和异步 NSURLConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8918501/
环境: Ubuntu 16.04 64 位 g++ 5.4.0 版 这是代码: #include ... auto g = std::gcd(10, 4); ... 我在编译命令中开启了-std=c
我正在尝试用 Python 编写欧几里得算法。它是找到两个非常大的数字的 GCD。公式是 a = bq + r 其中 a 和 b 是你的两个数,q 是 b 均分 a 的次数,r 是余数。 我可以编写代
我正在尝试创建一个处理非常大数字的 gcd 函数。因此,到目前为止我尝试过的任何事情都会导致错误。例如 : fun gcd(a : Int.toLarge, b : Int.toLarge): Int
我是 Haskell 的新手,实际上我才刚开始,我想对我将要问的问题有一点提示。 我目前正在尝试获取给定列表的 GCD。例如,列表 [3, 6, 9] 将返回 3。 目前,我想到了以下方法,我是否朝着
我有一段来自 API 黑暗时代的现有代码。它是一个基于 MPCreateTask 的线程。看起来我可以将其移至 GCG 队列,但有点复杂。当前有三个基于 MPCreateQueue 的队列用于三个优先
出于多种原因,我想让我的应用程序向后兼容 OS X 10.5。 到目前为止,我正在使用 10.6 中添加的大量 GCD 调度队列,如下所示: dispatch_async(dispatch_get_m
我有一个在一些设备上崩溃的 iOS 应用程序。鉴于发生这种情况时我在 iTunes 上看到的差评,崩溃似乎发生在代码中的同一点。 最后,一位好心人实际上联系了我,而不仅仅是留下评论,他们甚至为我安装了
我有一个定期运行的任务,它最初设计为使用 NSThread 和 NSTimer 在与主运行循环不同的单独运行循环上运行。 适应这一点以利用 GCD 的最佳方法是什么? 当前代码: -(void)ini
我想知道这两者之间的性能差异是什么。 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
我研究过 GCD 和线程安全。在苹果文档中,GCD 是线程安全的,即多线程可以访问。而且我了解了线程安全的含义,即每当多个线程访问某个对象时总是给出相同的结果。 我认为 Thread-Safe 和 G
我需要帮助来获取两个输入数字的 GCD。我不知道为什么它不会返回 GCD。例如,55 和 125 的 GCD 将为 5。任何帮助将不胜感激。它必须使用方法,而不是算法。 public static v
几天前我在编程挑战中遇到了这个问题。 在后端的 20 个测试用例中,我只得到了一个通过。这是我的解决方案 import java.util.Scanner; class TestClass {
我研究过 GCD 和线程安全。在苹果文档中,GCD 是线程安全的,即多线程可以访问。而且我了解了线程安全的含义,即每当多个线程访问某个对象时总是给出相同的结果。 我认为 Thread-Safe 和 G
我有一种方法可以帮助我将本地standardUserDefaults与Web服务同步。首先,我需要确保数据已成功同步,然后才能让该方法返回。我目前正在努力解决的问题是,我无法让GCD按特定顺序执行并完
我必须确保 3 个数字之间的 GCD 不大于 1。 这是我迄今为止该方法的代码: private int greatestCommonFactor(int a, int b, int c) {
我有两种在串行队列上运行的方法。每个方法都返回某个类的副本。我试图在保持数据完整性的同时实现线程安全解决方案。 例如: -(Users *) getAllUsers { __block
假设我们有一个 UIVewcontroller,叫它 A,在那个 VC 的 viewdidload 中我们添加两个 UIViewcontrollers(B,C)。现在为了使 A 的 Viewdidlo
我有几个任务被分派(dispatch)到串行队列,特别是一些被分派(dispatch)到组的任务。在调度这些任务后,我想给用户取消它们的选项,即使它们已经被执行。 我找不到任何方法来取消排队的任务,然
因此,我使用 dispatch_async 将 10 个任务放入并发队列中。它们不会阻塞下一个任务,并按顺序处理。我的 UI 具有响应能力。 for (int i = 0; i < 10; i++)
public static int divisor(int m, int n) { if (m == 0 || n == 0) { return m+n; } else
我是一名优秀的程序员,十分优秀!