将API连接调用分解为函数Objective-C

将API连接调用分解为函数Objective-C,objective-c,function,methods,Objective C,Function,Methods,这很可能是一个非常琐碎的问题,但为了检索信息,我已经建立了与API的连接。现在我在viewDidLoad中设置了所有内容。我知道有一种更有效的方法来放置这些信息供用户以后访问,但我对Objective-C缺乏经验,不知道如何操作。以下是我目前的所有安排 NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.myurl.com"]

这很可能是一个非常琐碎的问题,但为了检索信息,我已经建立了与API的连接。现在我在viewDidLoad中设置了所有内容。我知道有一种更有效的方法来放置这些信息供用户以后访问,但我对Objective-C缺乏经验,不知道如何操作。以下是我目前的所有安排

NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.myurl.com"]
                                              cachePolicy:NSURLRequestUseProtocolCachePolicy
                                          timeoutInterval:60.0];
    NSData *myResponse = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:nil error:nil];

    NSString *myString = [[NSString alloc] initWithData:myResponse encoding:NSUTF8StringEncoding];

    SBJsonParser *myParser = [[SBJsonParser alloc] init];

    NSArray *myData = [parser objectWithString:myString error:nil];
试试这个:

- (void)loadAndParseURL:(NSString *)URLString
             completion:(void (^)(NSArray *data))completion {

    NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:URLString]
                                              cachePolicy:NSURLRequestUseProtocolCachePolicy
                                          timeoutInterval:60.0];
    dispatch_async(dispatch_get_global_queue(DISPATH_QUEUE_PRIORITY_DEFAULT, 0), ^{
      NSData *myResponse = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:nil error:nil];

      NSString *myString = [[NSString alloc] initWithData:myResponse encoding:NSUTF8StringEncoding];

      SBJsonParser *myParser = [[SBJsonParser alloc] init];

      NSArray *myData = [parser objectWithString:myString error:nil];
      completion(myData);
    });
}

completion
是一个块(匿名函数指针),它接受数组作为参数并执行自定义代码块。在本例中,在从
myString
解析
myData
之后,该块保存局部变量的值,也称为“环境”,并在执行时(通常带有某种延迟)评估其内容
dispatch\u async
将发送请求并执行其他操作的匿名块放入后台队列(当然是后台线程)。因此,对该方法的调用甚至在收到响应之前就返回,您应该在
完成
块中安排任何事情。

如果您正在寻找将其拆分为线程,我将使用sendAsynchronousRequest

NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:URLString]
                                          cachePolicy:NSURLRequestUseProtocolCachePolicy
                                      timeoutInterval:60.0];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
   NSString *myString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
   SBJsonParser *myParser = [[SBJsonParser alloc] init];

    NSArray *myData = [parser objectWithString:myString error:nil];

   // Do what you want with the response and subscribe 
   //anywhere in your code to get notified when it completed.
   [[NSNotificationCenter defaultCenter] 
          postNotificationName:@"NotifyMeWhenDone" 
                        object:self];

}];

这个问题太开放了。您希望稍后根据用户操作、时间延迟或视图控制器生命周期中的稍后时间执行它吗?我需要在两个不同的页面上使用连接。因此,当用户更改页面时,它将具有相同的连接。很抱歉没有指定。所以您希望在后台建立连接,并在浏览“x”个页面时使其保持运行?我只是想说清楚,这样我才能给你正确的答案。您希望它在完成时通知您吗?非常感谢您的回复。完成(myData)的作用是什么?