こんにちは、私は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 のドキュメントを読み、簡単なデモをいくつか作成しました。大きなプロジェクトを試したり、堅牢なフレームワークやモデルをコーディングしたりしたことはありません。 ? どうもありがとう