ios同步网络请求处理程序返回结果

时间:2016-08-27 02:39:10

标签: ios objective-c multithreading networking

我遇到的问题是我的应用程序有一个线程,它定期需要在循环内部发出一系列网络请求。由于这是在一个单独的线程内,并且由于请求的性质(对本地网络上的设备而且响应很简单),我想同步执行此操作。网络通信是一个单独的networking类,而不是databaseController类。

我无法让networking类中的方法从完成处理程序中返回一些内容

+ (void)GetMessages
{
   NSURLSession *session = [NSURLSession sharedSession];
   NSURLRequest *request = [networking makeAuthenticatedRequest:@"subpath.html"];
   //NSString* returnable;
   NSURLSessionDataTask *task = [session dataTaskWithRequest:request
                                   completionHandler:
                              ^(NSData *data, NSURLResponse *response, NSError *error) {
                                  NSString* newStr = [[NSString alloc] initWithData:data
                                                         encoding:NSUTF8StringEncoding];
                                  //returnable = newStr;
                                  //return(newStr)
                                  NSLog(newStr);
                              }];
   [task resume];
}

上述代码有效但除了打印请求的结果外没有做任何事情。当我尝试任何注释掉的添加和必要的更改时,没有任何作用。我甚至试图传递对调用对象的引用并更新一个属性,用于在完成处理程序中存储newStr,但即使这样也行不通。

我正在尝试的是什么?如果是这样的话?

我应该补充一点,代码需要与ios 7-9兼容。

1 个答案:

答案 0 :(得分:1)

您需要执行以下操作:

NSURLSession *session = [NSURLSession sharedSession];
NSMutableURLRequest *request =
[NSMutableURLRequest requestWithURL:[NSURL
                                     URLWithString:@"https://www.yahoo.com"]
                cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
                    timeoutInterval:10
 ];

__block NSString* returnable; // notice the __block here
NSURLSessionDataTask *task = [session dataTaskWithRequest:request
                completionHandler:
                ^(NSData *data, NSURLResponse *response, NSError *error) {
                 NSString* newStr = [[NSString alloc] initWithData:data
                                    encoding:NSUTF8StringEncoding];
                 returnable = newStr;
                 // return(newStr); You cant return this here. Because the callback doesn't permit you to do so.
                 NSLog(@"%@", newStr);
        }];
[task resume];