Раньше я создавал одноэлементный класс в Objective-C для выполнения всех вызовов службы в моем коде. Однако в Swift используются замыкания, и я не могу добиться таких же результатов в Swift. Есть ли способ сделать то же самое в Swift 3?
@implementation ServiceManager
+(id)sharedManager {
static ServiceManager *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}
-(NSURLSession *)urlSession {
if (_urlSession) {
return _urlSession;
}
NSURLSessionConfiguration *defaultConfigObject =
[NSURLSessionConfiguration defaultSessionConfiguration];
_urlSession = [NSURLSession sessionWithConfiguration:defaultConfigObject delegate:nil delegateQueue:[NSOperationQueue mainQueue]];
_urlSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
_urlSession.sessionDescription = @"net.socialInvesting.nsurlsession";
return _urlSession;
}
-(void)ExecuteRequest:(NSURLRequest *)request withCompletion:(void (^)(id result, NSError *error))completionBlock {
NSURLSessionDataTask * dataTask =[[self urlSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if(error == nil) {
id result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
completionBlock(result,error);
} else {
NSLog(@"Error: %@", error.localizedDescription);
completionBlock(nil, error);
}
}];
[dataTask resume];
}
@end
Я вызываю эту функцию, как показано во фрагменте кода ниже.
[sharedServiceManager ExecuteRequest:urlRequest withCompletion:^(id result, NSError *error) {
if (result) {
LoginModel *model = [[LoginModel alloc]initWithDictionary:result error:NULL];
ResponseManager *manager = [ResponseManager sharedManager];
manager.loginResponse = model;
completionBlock(YES,NULL);
} else {
completionBlock(NO,error);
}
}];
Вот как я пытался сделать подобное выполнение в Swift. Но не может вернуть значения.
import UIKit
class ServiceManager: UIView {
var session = URLSession.shared
static let sharedSessionManager = ServiceManager()
class func sharedManager() -> ServiceManager {
return sharedSessionManager
}
func executeGetRequest(with urlString: String, inputDictionary:[String : Any], completionHandler: @escaping () -> (Error?, [[String : Any]])) {
let url = URL.init(string: urlString)
let urlRequest = URLRequest(url: url!)
let task = session.dataTask(with: urlRequest) { (data, response, error) in
if error != nil {
print("ERROR: could not execute request")
} else {
do {
let responseDict = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String: Any]
if let results = responseDict!["results"] as? [[String:Any]] {
completionHandler // How to return results and Error from here to the calling function
}
} catch {
print("ERROR: could not retrieve response")
}
}
}
task.resume()
}
}
Любая помощь будет оценена по достоинству.
@escaping () -> (Error?, [[String : Any]]))
Почему он там()
без ничего для побега? Вы имели в видуcompletionHandler: @escaping(Error?,[[String : Any]]?) -> Void) -> Void {
? (первый Void для замыкания, второй для метода). - person Larme   schedule 03.08.2017