Возвращаемое значение метода с использованием AsiHTTPRequest - PullRequest
0 голосов
/ 21 февраля 2012

У меня есть класс, который использует AsiHTTPRequest. Я хочу сделать такой метод:

-(NSData*)downloadImageFrom: (NSString*)urlString;
{
    // Set reponse data to nil for this request in the dictionary
    NSMutableData *responseData = [[NSMutableData alloc] init];
    [responseDataForUrl setValue:responseData forKey:urlString];

    // Make the request
    NSURL *url = [NSURL URLWithString:urlString];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [responseDataForUrl setValue:responseData forKey:[request url]];
    [request setDelegate:self];
    [request startAsynchronous];

    // Wait until request is finished (???? Polling ?????)
    // while(responsedata = nil) {
    //    do nothing
    // } BAD SOLUTION

    return responseData;

}

После этого. Метод делегата вызывается, когда responseData готов. Есть ли лучшее решение для продолжения, чем опрос в переменной responseData?

Ответы [ 3 ]

1 голос
/ 21 февраля 2012

Я использую ASIHttpRequest для большинства моих вызовов веб-служб, но в вашем случае (получение асинхронных данных изображения) я использую блоки с GCD. У меня есть класс с именем WebImageOperations и в этом классе у меня есть метод класса:

WebImageOperations.h:

+ (void)processImageDataWithURLString:(NSString *)urlString andBlock:(void (^)(NSData *imageData))processImage;

WebImageOperations.m:

+ (void)processImageDataWithURLString:(NSString *)urlString andBlock:(void (^)(NSData *imageData))processImage
{
    NSURL *url = [NSURL URLWithString:urlString];

    dispatch_queue_t callerQueue = dispatch_get_current_queue();
    dispatch_queue_t downloadQueue = dispatch_queue_create("com.achcentral.processimagedataqueue", NULL);
    dispatch_async(downloadQueue, ^{
        NSData * imageData = [NSData dataWithContentsOfURL:url];

        dispatch_async(callerQueue, ^{
            processImage(imageData);
        });
    });
    dispatch_release(downloadQueue);
}

Затем, чтобы позвонить, используйте это:

[WebImageOperations processImageDataWithURLString:@"MyURLForPicture" andBlock:^(NSData *imageData) {
        if (self.view.window) {
             UIImage *image = [UIImage imageWithData:imageData];
             self.myImageView.image = image;
        }
}];
0 голосов
/ 21 февраля 2012

Ваш делегат не должен быть отдельным классом.

- (void)someMethod:(NSUrl *)url
{
    ASIHTTPRequest *req = [ASIHTTPRequest requestWithUrl:url];
    [req setDelegate:self];
    //configure the request
    [req startAsynchronous];
}

- (void)requestDone:(ASIHTTPRequest *)request
{
   NSString *response = [request responseString];
   //do whatever with the response
}

Таким образом, ваш метод someMethod: запускает запрос и возвращает void.Когда запрос завершен, ваш ASIHTTPRequest запускает метод requestDone: для своего делегата, который это тот же объект .В этом методе вы делаете что угодно - устанавливаете ivar или именованное свойство, обрабатываете входящие данные и заполняете UITableVew, что угодно.

Обратите внимание, что теперь ASIHTTPRequest устарел, и его автор рекомендует вместо этого использовать что-то еще.AFNetworking кажется популярным выбором, но я недавно не начинал новый проект, поэтому я сам еще не выбрал его.

0 голосов
/ 21 февраля 2012

Вы определенно не должны делать опрос!

Делегат ASIHHTPRequest, который вы установили для себя, будет вызывать метод (см. Документацию ASIHTTPRequest для получения подробной информации об этом методе делегата), чтобы уведомить вас, когда это произойдет.законченный.В этом методе делегата вызовите любой другой код, который вы хотите сделать.Не беспокойтесь о возврате изображения - все это асинхронно.

...