我遇到的问题是我的应用程序有一个线程,它定期需要在循环内部发出一系列网络请求。由于这是在一个单独的线程内,并且由于请求的性质(对本地网络上的设备而且响应很简单),我想同步执行此操作。网络通信是一个单独的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兼容。
答案 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];