2016-08-27 56 views
1

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

我不能得到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

你需要做到以下几点:

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]; 
相关问题