美文网首页
2025-04-15 网络库Manager是否需要封装成单例

2025-04-15 网络库Manager是否需要封装成单例

作者: 我是小胡胡123 | 来源:发表于2025-04-14 12:17 被阅读0次

网络库:

AFHTTPSessionManager
NSURLSession强引用持有AFHTTPSessionManager
mananger和manager的NSURLSessionConfiguration每次都是创建新的,manager不会释放,dealloc方法没有调用

NSURLSessionConfiguration 中有一个属性:
/* The cookie storage object to use, or nil to indicate that no cookies should be handled */
@property (nullable, retain) NSHTTPCookieStorage *HTTPCookieStorage;

不同的session
它决定了这个 session 用哪套 CookieStorage。如果不指定,它默认使用 [NSHTTPCookieStorage sharedHTTPCookieStorage],即全局共享 cookie storage。
所以默认情况下 多个mananager 应该是能共享cookie的,因为虽然用的不同的NSURLSessionConfiguration,不同的cookie有不同的cookie对象,但是用sharedHTTPCookieStorage的所以是单例的,可以共享

在manange的创建方法中 添加日志:

- (instancetype)initWithBaseURL:(NSURL *)url
           sessionConfiguration:(NSURLSessionConfiguration *)configuration
{
    self = [super initWithSessionConfiguration:configuration];
    if (!self) {
        return nil;
    }

    // Ensure terminal slash for baseURL path, so that NSURL +URLWithString:relativeToURL: works as expected
    if ([[url path] length] > 0 && ![[url absoluteString] hasSuffix:@"/"]) {
        url = [url URLByAppendingPathComponent:@""];
    }

    self.baseURL = url;

    self.requestSerializer = [AFHTTPRequestSerializer serializer];
    self.responseSerializer = [AFJSONResponseSerializer serializer];
    NSLog(@"---->cookie=%p, %@",self.session.configuration.HTTPCookieStorage,self.session.configuration.HTTPCookieStorage);
    return self;
}

---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:1>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:1>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:1>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:5>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:9>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:11>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:13>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:13>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:15>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:15>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:15>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:23>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:23>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:23>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:23>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:23>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:23>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:23>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:23>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:23>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:23>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:23>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:23>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:23>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:23>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:23>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:23>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:23>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:23>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:23>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:23>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:23>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:23>
---->cookie=0x2837584a0, <NSHTTPCookieStorage cookies count:23>

MWNetworkEngine网络库中有不同方式的网络调用方式
requestCommonURL 是每次创建manager
sendRequestWithHostType 是使用单例sharedEncryptSessionManager (manager )

 
#1  0x000000010dd5bdcc in -[MWNetworkEngine(Common) requestCommonURL:method:params:header:cerPath:policyMode:customTimeout:expectJsonRequest:expectJsonResponse:expectContentTypes:success:failure:] at /Users/mi/Documents/miwear/MiJiaWear/Pods/miwearNetWorkLib/miwearNetWorkLib/Classes/MWNetworkEngine.m:1710

        AFHTTPSessionManager *commonSessionManager = [AFHTTPSessionManager manager];




#3  0x000000010dd54e2c in __129-[MWNetworkEngine sendRequestWithHostType:method:encryptPath:path:params:timeout:headers:ssecurity:serviceToken:success:failure:]_block_invoke at /Users/mi/Documents/miwear/MiJiaWear/Pods/miwearNetWorkLib/miwearNetWorkLib/Classes/MWNetworkEngine.m:922


@interface MWNetworkEngine ()
@property (nonatomic, strong) AFHTTPSessionManager *sharedAivsSessionManager;
@property (nonatomic, strong) AFHTTPSessionManager *sharedEncryptSessionManager;
@end

      AFHTTPSessionManager *manager = ws.sharedEncryptSessionManager;

+ (instancetype)sharedInstance {
    static MWNetworkEngine* engineInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        engineInstance = [[self alloc] init];
    });
    return engineInstance;
}

- (instancetype)init {
    self = [super init];
    if (self) {
        _timeDiffWithServer = 0;

        self.sharedEncryptSessionManager = [AFHTTPSessionManager manager];
}

    


@implementation AFURLSessionManager

- (instancetype)init {
    return [self initWithSessionConfiguration:nil];
}

@interface AFURLSessionManager ()
@property (readwrite, nonatomic, strong) NSURLSessionConfiguration *sessionConfiguration;
@property (readwrite, nonatomic, strong) NSOperationQueue *operationQueue;
@property (readwrite, nonatomic, strong) NSURLSession *session;

- (NSURLSession *)session {
    
    @synchronized (self) {
        if (!_session) {
            _session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];
        }
    }
    return _session;
}



@implementation AFURLSessionManager

- (instancetype)init {
    return [self initWithSessionConfiguration:nil];
}

- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration {
    self = [super init];
    if (!self) {
        return nil;
    }

    if (!configuration) {
 //每次返回的都是新的NSURLSessionConfiguration对象
        configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    }

相关文章

网友评论

      本文标题:2025-04-15 网络库Manager是否需要封装成单例

      本文链接:https://www.haomeiwen.com/subject/ishdbjtx.html