Как именно работает 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   }

после этого создается операция и ей устанавливаются блок успеха и блок отказа, затем мы запускаем операцию, она запускает 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;
}

метод завершения устанавливает состояние операции, и он использует технологию KVO для завершения операции: я не виделObservValueForKeyPath и [obj addObserver:self forKeyPath:@"isFinished" options:0 context:NULL]; как работает КВО?

setState:

    [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, пожалуйста, объясните эту структуру,

Еще один вопрос, сетевые запросы выполняются в общем потоке, не замедлит ли это запрос?

Я действительно хочу улучшить свои навыки в многопоточном программировании, и мне нужны образцы и предложения, я прочитал документацию Apple и сделал несколько простых демонстраций, еще не пробовал большой проект или кодировать надежную структуру или модель, с чего мне начать? ? огромное спасибо


person nickyu    schedule 26.08.2013    source источник


Ответы (1)


completionBlock является свойством суперкласса AFJSONRequestOperation, NSOperation. Он выполняется, когда операция завершается.

person Dennis Pashkov    schedule 03.12.2013