ios - AFNetworking 究竟是如何工作的?

标签 ios multithreading afnetworking

大家好,我玩了一段时间的ASIHttpRequest,AFNetworking,今天,我尝试更深入地阅读AFNetworking的源代码,它确实是一个功能强大且设计精良的网络框架,现在我有几个问题要问: 1、AFJSONRequestOperation:

NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:kMobileBind parameters:paramsBase];

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {  //successblock   } fail:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON){  //failblock   }

在此之后,创建的操作以及成功 block 和失败 block 都设置给它,然后我们开始操作,它在单例线程中启动NSURLconnection

[self performSelector:@selector(operationDidStart) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]];

里面的操作DidStart:

 [self.lock lock];
 NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
    for (NSString *runLoopMode in self.runLoopModes) {
        [self.connection scheduleInRunLoop:runLoop forMode:runLoopMode];
        [self.outputStream scheduleInRunLoop:runLoop forMode:runLoopMode];
    }
[self.connection start];
[self.lock unlock];

此操作运行并调用 NSURLconnection 回调,

 - (void)connectionDidFinishLoading:(NSURLConnection *)__unused connection {
self.responseData = [self.outputStream propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
[self.outputStream close];
[self finish];
self.connection = nil;
}

- (void)finish {
    self.state = AFHTTPOperationFinishedState;
}

finish 方法设置操作的状态,它使用 KVO 技术来完成操作: 我没有看到 observeValueForKeyPath 和 [obj addObserver:self forKeyPath:@"isFinished"options:0 context:NULL]; KVO 是如何工作的?

设置状态:

    [self willChangeValueForKey:newStateKey];
    [self willChangeValueForKey:oldStateKey];
    _state = state;
    [self didChangeValueForKey:oldStateKey];
    [self didChangeValueForKey:newStateKey];



- (BOOL)isFinished {
    return self.state == AFHTTPOperationFinishedState;
}

然后我卡在这里了,我找到了 setcallblock 基金,但无法理解如何调用 self.completionBlock:

- (void)setCompletionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success

   failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure

{
    self.completionBlock = ^ {
    if ([self isCancelled]) {
        return;
    }

    if (self.error) {
        if (failure) {
            dispatch_async(self.failureCallbackQueue ? self.failureCallbackQueue : dispatch_get_main_queue(), ^{
                failure(self, self.error);
            });
        }
    } else {
        if (success) {
            dispatch_async(self.successCallbackQueue ? self.successCallbackQueue : dispatch_get_main_queue(), ^{
                success(self, self.responseData);
            });
        }
    }
};

可能我确实仔细阅读了代码,但这确实让我很困惑,任何有 AFNetworking 经验的人请解释一下这个框架,

还有一个问题,网络请求是跑在共享线程上的,会不会拖慢请求速度?

我确实想提高我在多线程编程方面的技能,我需要示例和建议,我已经阅读了苹果的文档,并做了一些简单的演示,还没有尝试过大型项目或编写健壮的框架或模型,如何我开始吗?非常感谢

最佳答案

completionBlockAFJSONRequestOperation父类(super class) NSOperation 的属性。当操作完成时执行。

关于ios - AFNetworking 究竟是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18439356/

相关文章:

iOS - "Simulate"推送通知

java - 使用 wait() 时的同步方法

c++ - 在 c++0x 中使用 __thread

ios - 从 AFHTTPSessionManager 获取数据

ios - 如何使用 Cocoapods 制作基于两个静态库的动态框架(Swift)

objective-c - 如何在Objective-C中使用NSXMLParser获取标签参数?

iOS 使用参数获取对 Rails API 的请求

ios - 加载webView并同时进行网络请求

ios - 如何在 iOS 中将对象传递给 NextViewController?

c++ - 导致非原子撕裂