【问题标题】:breaking up an API connection call into functions Objective-C将 API 连接调用分解为 Objective-C 函数
【发布时间】:2013-01-23 16:19:31
【问题描述】:

这很可能是一个非常微不足道的问题,但我设置了与 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];

【问题讨论】:

  • 这个问题太开放了。您想稍后根据用户操作、时间延迟还是在视图控制器生命周期的后期执行它?
  • 我将需要在 2 个不同的页面上使用连接。因此,当用户更改页面时,它将具有相同的连接。抱歉没有具体说明。
  • 所以您想在后台建立一个连接并让它在您浏览“x”页时保持运行?只是为了清楚,所以我可以给你正确的答案。您希望它在完成时通知您吗?

标签: objective-c function methods


【解决方案1】:

试试这个:

- (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 是一个块(匿名函数指针),它接受一个数组作为参数并执行自定义代码块。该块保存局部变量的值,也就是“环境”,并在执行时评估其内容(通常有某种延迟),在这个例子中,在 myDatamyString 解析之后。 dispatch_async 将发送请求并执行其他操作的匿名块放入后台队列(当然是在后台线程中)。所以在收到响应之前调用这个方法就被返回了,你应该在completion块内安排任何事情。

【讨论】:

  • 非常感谢您的回复。完成(myData)有什么作用?
【解决方案2】:

如果您正在寻找将其转入线程的内容,我会使用 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];

}];

【讨论】:

    猜你喜欢
    • 2015-05-07
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    相关资源
    最近更新 更多