0

こんにちは、私はASIHttpRequestしばらくの間 AFNetworking で遊んできました。今日、私は AFNetworking のソース コードをより深く読み込もうとしました。これは本当に強力でよく設計されたネットワーク フレームワークです。いくつかの質問があります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   }

この後、操作が作成され、成功ブロックと失敗ブロックが設定され、操作が開始NSURLconnectionされ、シングルトン スレッドで開始されます。

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

内部操作DidStart:</p>

 [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;
}

終了メソッドは操作の状態を設定し、KVO 技術を使用して操作を終了します。observerValueForKeyPath と [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の経験がある人なら誰でもこのフレームワークを説明してください.

もう 1 つ質問があります。ネットワーク リクエストは共有スレッドで実行されますが、リクエストの速度は低下しますか?

mutilthread プログラミングのスキルを向上させたいです。サンプルと提案が必要です。Apple のドキュメントを読み、簡単なデモをいくつか作成しました。大きなプロジェクトを試したり、堅牢なフレームワークやモデルをコーディングしたりしたことはありません。 ? どうもありがとう

4

1 に答える 1