iOS:使用异步

时间:2013-03-31 18:40:19

标签: ios asynchronous nsurlconnection

我目前有一个有2张桌子的屏幕。我正在同步获取数据并将其放在屏幕上。代码看起来像: viewController.m

DBAccess_Error_T = [getList:a byCompanyID:1];
DBAccess_Error_T = [getList:b byCompanyID:2];
[self putListAOnScreen];
[self putListBOnScreen];

DBAccess.m

+ (DBAccess_Error_T)getList:(NSMutableArray*)a byCompanyID:(NSInteger)cID
{
    // Pack this up in JSON form
    [self queryDB:postData];
    // Unpack and put it into variable a
}

+ (id)queryDB:(id)post
{
    // Send request
    // Get back data
}

我现在正试图将其切换为异步,我正在努力。即使有网站教程和文档也很难。

由于我的所有数据库实用程序都与viewControllers位于不同的文件中,因此我不确定如何使用didReceiveData和didReceiveResponse处理程序。另外,由于我有2个数组来填充我的2个表,我如何区分didReceiveData的差异?

相反,我现在要做的是使用sendAsynchronousRequest,但似乎我需要为每个发送函数创建一个解包函数...让我知道如果我离开这里...它看起来像什么像:

viewController.m保持不变

DBAccess.m
+ (DBAccess_Error_T)getList:(NSMutableArray*)a byCompanyID:(NSInteger)cID
{
    NSDictionary *post = /*blah blah*/
    [self queryDB:post output:(a)];
}

+ (id)queryDB:(id)post output:(id)output
{ 
    NSError *error;
    NSData *jsonPayload = [NSJSONSerialization dataWithJSONObject:post options:NSJSONWritingPrettyPrinted error:&error];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url   
                                         cachePolicy:NSURLRequestUseProtocolCachePolicy
                                         timeoutInterval:60.0];
    [theRequest setHTTPMethod:@"POST"];
    [theRequest setHTTPBody:jsonPayload]; 

    [NSURLConnection sendAsynchronousRequest:request
                                       queue:[[NSOperationQueue alloc] init]
                           completionHandler:^(NSURLResponse *response,
                                               NSData *data,
                                               NSError *error)
     {
         if ([data length] >0 && error == nil)
         {
             [self unpackDataForList:output data:data]; // This function needs to be different depending on which function called queryDB...the data will be unpacked in a different way
         }
    }
}

+ (void)unpackDataForList:(id)output data:(NSData*)data
{
    // Do my unpacking here and stick it into 'output'.
}

如何调用其他unpackData函数?函数指针是正确的方法吗?这种做法是否已经过时了?任何提示将不胜感激!

1 个答案:

答案 0 :(得分:0)

你有没有看过ASIHTTPRequest?通过允许您使用块,它可以让您的生活更轻松。以下是如何发出异步请求的示例:

- (IBAction)grabURLInBackground:(id)sender
{
   NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
   __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
   [request setCompletionBlock:^{
      // Use when fetching text data
      NSString *responseString = [request responseString];

      // Use when fetching binary data
      NSData *responseData = [request responseData];
   }];
   [request setFailedBlock:^{
      NSError *error = [request error];
   }];
   [request startAsynchronous];
}

您可以在此处找到更多信息:

http://allseeing-i.com/ASIHTTPRequest/