首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSURLSession在NSURLProtocol中的应用

NSURLSession在NSURLProtocol中的应用
EN

Stack Overflow用户
提问于 2016-02-25 22:32:26
回答 1查看 762关注 0票数 0

我试图使用NSURLProtocol为http://和https://连接创建一个透明的NSURLSession。然而,目前,即使完成处理程序正在运行,应用程序(UIWebView)的URL请求仍然是空白的。有人有什么想法吗?代码如下:

代码语言:javascript
复制
#import "MyURLProtocol.h"

// AppDelegate
#import "AppDelegate.h"

static NSString * const MyURLProtocolHandledKey = @"MyURLProtocolHandledKey";

@interface MyURLProtocol () <NSURLConnectionDelegate,NSURLSessionDelegate>

@property (nonatomic, strong) NSURLConnection *connection;
@property (nonatomic, strong) NSMutableData *mutableData;
@property (nonatomic, strong) NSURLResponse *response;

@end

@implementation MyURLProtocol

+(BOOL)canInitWithRequest:(NSURLRequest*)request
{
    if ([NSURLProtocol propertyForKey:MyURLProtocolHandledKey inRequest:request])
        return NO;
    NSString *scheme = request.URL.scheme.lowercaseString;
    return [scheme isEqualToString:@"http"] || [scheme isEqualToString:@"https"];
}

+ (NSURLRequest *) canonicalRequestForRequest:(NSURLRequest *)request {
    return request;
}

-(void)startLoading
{      
    NSMutableURLRequest *newRequest = [self.request mutableCopy];
    [NSURLProtocol setProperty:@YES forKey:@"MyURLProtocolHandledKey" inRequest:newRequest];

    NSURLRequest *request = newRequest;

    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request
                                            completionHandler:
                                  ^(NSData *data, NSURLResponse *response, NSError *error) {
                                      if (error != nil) {
                                          NSLog(@"There was an error");
                                      }
                                      NSLog(@"Completiio handler ran");
                                      self.mutableData = [NSMutableData dataWithData:data];
                                      self.response = response;
                                  }];

    [task resume];
}

- (void) stopLoading {

    [self.connection cancel];
    self.mutableData = nil;
}

// Delegate stuff

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [self.client URLProtocol:self didLoadData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    [self.client URLProtocolDidFinishLoading:self];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    [self.client URLProtocol:self didFailWithError:error];
}

@end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-08 02:24:57

您的代码使用NSURLConnection委托将数据传递回调用方,例如connectionDidFinishLoading:

要解决这个问题:

  • NSURLSession委托方法替换它们。
  • 创建并保留一个自定义会话,其委托是您的协议类实例;共享会话没有委托,因此它不会调用类的委托方法。
  • 删除回调块,以便正确调用请求完成的委托方法。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35639740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档