2013-01-18 23 views
1

中获取它我正在使用NSURLConnection从响应中加载数据。它的工作原理应该如此,委托方法connectionDidFinishLoading具有连接实例和我需要的数据。问题是,我想传递一些信息与请求一起,这样,当连接完成加载后我可以得到它:如何通过NSURLConnection实例传递信息,以便我可以从connectionDidFinishLoading

  1. 用户想要通过(Facebook,微博, C到共享URL的内容, d)。
  2. NSURLConnection用于获取
  3. 一旦我有内容,我用的是SL框架 小号LComposeViewController:composeViewControllerForServiceType,需要 给它的服务类型
  4. 在这一点上,我不知道该URL的内容用户在步骤1中选择了哪些服务。我想用NSURLConnection发送。

我可以延长NSURLConnection的房产吗?这似乎非常严厉。必须有一个“正确的方法”来做到这一点。

非常感谢

回答

4

假设你不需要NSURLConnection过程的基于委托的版本,某些其他原因,这是一个很好的用例的基于块的版本:

- (void)shareContentAtURL:(NSURL *)shareURL viaService:(NSString *)service 
{ 
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:shareURL]; 
    NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 

    [NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) 
    { 
     if ([data length] == 0 && error == nil) { 
      // handle empty response 
     } else if (error != nil) { 
      // handle error 
     } else { 
      // back to the main thread for UI stuff 
      [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
       // do whatever you do to get something you want to post from the url content 
       NSString *postText = [self postTextFromData:data]; 

       // present the compose view 
       SLComposeViewController *vc = [SLComposeViewController composeViewControllerForServiceType:service]; 
       [vc setInitialText:postText]; 
       [self presentViewController:vc animated:YES]; 
      }]; 
     } 
    }]; 

} 

由于块可以捕获周围范围内的变量,因此您可以使用已有的用于在NSURLConnection的完成块内用户选择服务的任何上下文。

如果您仍然与基于代理的NSURLConnection API无论出于何种原因都结婚,那么您总是可以使用伊维尔或其他某个状态附加到处理此过程的任何对象:设置self.serviceType或某些此类用户选择一项服务,然后在您从NSURLConnectionDelegate方法中获得内容并准备好显示撰写视图时再引用它。

+0

保持基于委托的连接的原因可以很简单 - 基于块的版本在iOS4.3下不起作用,它在iOS5.0中引入。 – lupatus

+0

一般来说不是一个坏的理由(至少如果你想要支持一个已经发布的应用程序; iOS 4对于新的开发来说已经很旧了)。但'SLComposeViewController'也不在iOS 4.x上,所以大概人们不必担心这种情况。 – rickster

+0

非常优雅的解决方案rickster,我永远不会想到这个!大大清理我的代码。无关(?)但有趣的是,对于Twitter,我正在尝试从主线程中更新UI,但FaceBook工作正常。嗯。 – ToddB

1

你可以检查一个NSURLConnection实例的URL财产,并通过与类似- (ServiceType)serviceTypeForURL:(NSURL *)theURL;

所有NSURLConnectionDelegate方法解析URLbaseURLabsoluteString财产通过调用NSURLConnection确定服务object-so you can get it from

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

相关问题