2013-06-30 45 views
0

我有一个应用程序,目前从Web服务获取NSURLConnection及其委托方法的JSON数组。这将返回一个用户数组。但现在我必须获取用户的观点。我是否需要创建一个新的NSURLConnection来进行第二个调用(但是,我将如何处理来自两个不同调用的委托方法的数据?)还是有办法创建多个操作?我可以使用NSURLRequest处理多个操作吗?

回答

2

对于每个请求,您需要一个新的NSURLConnection

有关问题的最好的办法是有

  1. “模范”代表你的用户。例如。字典的NSArray,其中一个字典表示一个用户。

  2. 一个获取用户数组的专用类。它使用异步模式,类似于NSOperation,可能它成为NSOperation的子类。基本上,它有一个start方法和一个完成块。这个类将一个NSURLConnection封装为伊娃,响应数据以及可能的几个状态信息,如NSURLResponse对象和可能是NSError对象。让这个类有一个完成块,其参数返回预期结果或NSError。完成块可能有这样的签名:

    ,其获取用户的“点”
    typedef void (^completion_block_t)(id result); 
    
  3. 另外一个专用类。基本上,和上面一样。

  4. 甲异步包装方法具有下列签名:

    typedef void (^completion_block_t)(id result); 
    
    -(void) fetchUsersAndPoints:(completion_block_t)completionHandler; 
    

    其中第一获取用户阵列。然后,成功完成后,为每个用户提取用户的“点”。当所有异步请求完成或发生错误时,它会调用完成处理程序。

第一个提示:您需要使用“连续”来“链接”两个或更多异步函数。基本原理:

 asyncA(^(id resultA) { 
      asyncB(^id(id resultB){ 
       ... 
       asyncC(^id(id result){ 
        NSLog(@"result: %@", result);  
       }); 
      }  
     }); 

这将读取:执行asyncA。如果完成执行asyncB。如果完成执行asyncC。

第二提示:您可以同时调用“点要求”。

第三提示:当“点请求”的完成处理程序被调用了N次时,你知道什么时候所有“点请求”都完成了,其中N是用户数。

第一次警告:

您可能需要将接入模式阵列同步,并且也完成块中的访问计数器N。

第二个注意事项:

当你有太多的“点请求,”你可能需要利用一个队列(NSOperationQueue为例),你限制由NSURLConnection情况下进行的并发请求的最大数量。

+0

好,现在我在我的viewDidLoad中创建NSURLRequest&NSURLConnection,然后在connectionDidFinishLoading中接收数据并填充我的usersArray。我刚创建了一个HelperClass来处理URL抓取。所以我可以在vc类中创建NSOperation并调用helper类,或者其他选项是使用NSURLConnection委托回调。但是我在哪里可以将这些回调方法放在助手类中呢? – marciokoko

+0

重要的是,我已经把封装了NSURLConnection的*非常有限的*类的样本,响应数据和其他状态信息。这应该给你一个开始:[SimpleGetHTTPRequest](https://gist.github.com/couchdeveloper/5764723) – CouchDeveloper

+0

Thx,我看到了类,我现在明白SimpleGetHTTPRequest类可以多次调用,每次调用一次取。最后一件事,结果对象如何返回到viewcontroller以及performSelectorOnMainThread:(start)?我对这是如何工作有不同的想法(显然是错误的:)) – marciokoko

0

最简洁的方法是为每个连接设置一个属性/ ivar,然后将委托方法的参数与它们进行比较。您也可以获得连接请求并获取它的URL,但由于硬编码数据,这似乎是一个不好的方法。

+0

你的意思是我应该将它们命名为connection1和connection2,然后在委托方法 - (void)connectionDidFinishLoading:(NSURLConnection *)连接我应该检查连接参数?确切地说,是 – marciokoko

+0

。但使用更多的解释性名称:) –

+0

我到底该如何检查connectionDidFinishLoading方法中的连接名称? – marciokoko

相关问题