我已经让这段代码工作了大约12个月,并且今天尝试进行一些无关的更改,首次使用Xcode 9构建这个macOS应用程序。从主视图控制器init中调用时,代码可以正常工作,但每隔一段时间就会因超时而失败。但是,服务器从不记录第二次和后续调用。我已经检查过最后一个Xcode 8版本是否仍在工作,所以我认为这是对线程的一些改变?
+ (void) postRequest:(NSString *)url withContentType:(NSString *)contentType body:(NSData *)body onCompletion:(void (^)(BOOL success, NSDictionary *json, NSError *error))onCompletion
{
NSMutableURLRequest *postRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
postRequest.HTTPMethod = @"POST";
[postRequest addValue:contentType forHTTPHeaderField: @"Content-Type"];
postRequest.HTTPBody = body;
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:postRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSDictionary *json = ( data != nil ) ? [NSJSONSerialization JSONObjectWithData:data options:0 error:nil] : [NSDictionary dictionary];
BOOL success = !error && ![[json valueForKey:ERROR] integerValue];
onCompletion( success, json, error);
}];
[dataTask resume];
}
我认为这些操作是故意放在后台线程上的,但我对如何实现这一目标感到茫然。将它放在不同点的主线程上没有任何效果。
我不知道它是否相关,但我使用自定义NSURLProtocol来插入授权头,另一个区别是每次调用时协议被多次调用,而以前只调用一次。
它就像更换线一样简单:
NSURLSession *session = [NSURLSession sharedSession];
有:
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:config];