Обратный вызов NSURLConnectionDelegate в одной функции

Я пытаюсь создать свой собственный класс запросов, который я намерен использовать в своем приложении. Вот код, который я придумал до сих пор.

-(IIWRequest *)initAndLaunchWithDictionnary:(NSDictionary *)dictionnary
{
    self=[super init];
    if (self) {
        // Create the request.
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://xxxxx.com/app/"]];

        // Convert data
        SBJsonWriter *jsonWriter = [[SBJsonWriter alloc] init];
        NSString *jsonData = [jsonWriter stringWithObject:dictionnary];
        NSLog(@"jsonData : %@",jsonData);
        NSData *requestData = [jsonData dataUsingEncoding: NSUTF8StringEncoding];
        request.HTTPBody = requestData;

        // This is how we set header fields
        [request setHTTPMethod:@"POST"];
        [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
        [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
        [request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
        [request setHTTPBody: requestData];

        // Create url connection and fire request
        NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
        [self activateNetworkActivityIndicator];
        if (connection) {
            NSLog(@"Connection");
        } else {
            NSLog(@"No connection");
        }
    }
    return self;
}

Я включил NSURLConnectionDelegate. Я хотел бы запустить обратные вызовы соединения, такие как завершение или отказ от функции, упомянутой ранее. Цель всего этого состоит в том, чтобы получить только один метод для вызова в конце, который выглядит так:

-(IIWRequest *)initAndLaunchWithDictionnary:(NSDictionary *)dictionary inBackgroundWithBlock:^(BOOL succeeded){}

Любая идея ? Спасибо !


person Ambroise Collon    schedule 21.01.2014    source источник


Ответы (3)


Используйте блочный метод класса NSURLConnection, это также уменьшит вашу функциональность sendAsynchronousRequest:queue:completionHandler:

Прочтите это документ.

person Tirth    schedule 21.01.2014
comment
Спасибо ! Это то, что я искал! - person Ambroise Collon; 22.01.2014

Я бы вряд ли предложил вам использовать одну из существующих на данный момент библиотек для вызова URL-адресов. Одним из лучших, которые я знаю, является AFNetworking https://github.com/AFNetworking/AFNetworking. Существует множество примеров, и он прост в использовании, и я уверен, что вам стоит его использовать.

В любом случае, если вы хотите создать свой собственный класс, я бы посоветовал вам прочитать сообщение, написанное Кадзуки Сакамото здесь NSURLConnection и центральная диспетчеризация.

С Уважением

person Radoslaw Wasiuk    schedule 21.01.2014

Если вы используете iOS 7, я ОЧЕНЬ рекомендую вам использовать классы NSURLSession, этот новый сетевой API действительно удивителен и прост.

В любом случае, чтобы ответить на ваш вопрос, вам просто нужно сохранить ссылку обратного вызова в своем классе и вызвать ее, когда вы получите ответ от сервера.

Чтобы сохранить ссылку, вы можете сделать что-то вроде этого:

// in your .h file
typedef void (^ResponseBlock)(BOOL success);

// in your .m, create a class extension and put declare the block to use it for callback
@interface MyClass ()
{
    ResponseBlock callback;
}

// You can store reference using equal like this
- (void)myMethodRequestWithResponseBlock:(ResponseBlock)responseBlock
{
    callback = responseBlock;
    // statements
}

// And finally, you call back block simple like this:
callback(success);

Опять же, используйте NSURLSession API, если можете, вы упростите себе работу.

Я надеюсь, что это может помочь вам. Ваше здоровье!

person Jan Cássio    schedule 21.01.2014