这是在Objective-C中使用Blocks的有效方法吗?

时间:2011-11-11 23:06:26

标签: objective-c cocoa asynchronous objective-c-blocks grand-central-dispatch

我一直在构建一个HTTP客户端,它使用Web服务在客户端和服务器之间同步信息。我一直在使用Blocks和NSURLConnection在客户端实现这一点,但我在objc_msgSend()中频繁出现EXC_BAD_ACCESS崩溃。根据我的理解,这通常意味着已经调用了从堆栈中掉落的存储块。我认为我已正确编码以避免这种情况,但我仍然卡住了。

以下是我的代码在概念上的作用。它首先调用“synchronizeWithWebServer”。该方法调用“listRootObjectsOnServerWithBlock:”,它接受在方法返回时调用的块。

“listRootObjectsOnServersWithBlock:”异步启动到Web服务器的NSURLConnection。它期望在返回时调用块。在该块中,我希望能够执行原始块(因此恰当地命名为“块”)。

这只是我的代码的简化版本。真正的同步过程比较复杂,但它与下面的内容大致相同。

有时代码运行得很好,但是大约80%的时间它在例程中很早就崩溃了。当我的数据集变大时,它似乎更容易崩溃。

  - (void)synchronizeWithWebServer
  {
       [self listRootObjectsOnServerWithBlock:^(NSArray *results, NSError *error) {

           //Iterate over result objects and perform some other similar routines.
       }];
  }

  - (void)listRootObjectsOnServerWithBlock:(void (^)(NSArray *results, NSError *error))block
  {
       //Create NSURLRequest Here

       //Create connection asynchronously.
       block = [block copy];
       [NSURLConnection sendAsynchronousRequest:urlRequest 
                                          queue:[NSOperationQueue currentQueue]
                              completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){

                       //Parse response from web server (stored in NSData *data)
                       NSArray *results = .....

                       //Call 'block'
                       block(results, error);
                       [block release];
                       }];
   }

0 个答案:

没有答案