2014-02-19 41 views
2

在我的iPhone应用程序中,我使用了dispatch_async块没有问题。该应用程序检查价格更新网站,解析HTML,相应地更新核心数据模型,然后刷新正在查看的表。iPhone应用程序与dispatch_async崩溃如果操作未完成

但是,在我最新的应用程序中,我发现我可以通过在价格更新过程运行时切换出应用程序来使应用程序崩溃。第一次和第二次使用之间的差异似乎只是我从表refreshController(即tableViewController现在内置的“拉到再刷新”机制)调用调度块,而现在是iOS7。

任何人都可以向我推荐dispatch_async应该如何在已知条件下正常中止,例如用户希望停止进程,或者如果他们切换这样的应用程序,我想拦截该活动以正确管理该块, 请?

如果有任何有关块和块的好的背景知识,我会很高兴看到这样的链接 - 谢谢!

这是我使用(大部分样板)dispatch_async代码,为了您的方便:

priceData = [[NSMutableData alloc]init];  // priceData is declared in the header 
priceURL = …  // the price update URL 

NSURL *requestedPriceURL = [[NSURL alloc]initWithString:[@“myPriceURL.com”]]; 
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:requestedPriceURL]; 

dispatch_queue_t dispatchQueue = dispatch_queue_create("net.fudoshindesign.loot.priceUpdateDispatchQueue", NULL); //ie. my made-up queue name 
dispatch_async(dispatchQueue, ^{ 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:urlRequest delegate:self startImmediately:YES]; 
      [conn start]; 
     }) 
}); 

回答

0

没有明确规定在调度队列取消。基本上,这将是一个semaphore

NSOperationQueue(更高层次的抽象,但仍然使用底下的GCD)支持取消操作。您可以创建一系列NSOperations并将它们添加到NSOperationQueue,然后在不需要它完成时将消息cancelAllOperations添加到队列中。

有用的链接:

http://www.cimgf.com/2008/02/16/cocoa-tutorial-nsoperation-and-nsoperationqueue/

Dispatch queues: How to tell if they're running and how to stop them

2

那样板代码看起来很没用。

您创建一个串行队列。您在队列上派发一个块,除了在主队列上分派块之外什么也不做。你也可以直接派发到主队列中。

1

虽然你有一个异步块,但是你在该块的主线程上执行NSURLConnection请求,这就是为什么如果进程没有完成,应用程序会崩溃。在后台线程中执行请求。您在此代码中阻止主线程。

你可以这样说:

dispatch_queue_t dispatchQueue = dispatch_queue_create("net.fudoshindesign.loot.priceUpdateDispatchQueue", 0); //ie. your made-up queue name 
dispatch_async(dispatchQueue, ^{ 
     NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:urlRequest delegate:self startImmediately:YES]; 
     [conn start]; 
     ... 
     //other code 
     ... 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      //process completed. update UI or other tasks requiring main thread 
     }); 
    }); 

尝试阅读和练习更多的GCD。

Grand Central Dispatch (GCD) Reference from Apple Docs

GCD Tutorial

+0

只知道,是可以安全使用的'self',而不是'的UIViewController __weak weakSelf = self'在'dispatch_async'? –

+0

是的,在异步块中使用self是安全的..但是你不能在后台线程块中更新UI。 –

+0

好的谢谢。很高兴知道 –