ASIHTTPRequestTester: Асинхронный не работает - PullRequest
1 голос
/ 02 декабря 2011

Я пытаюсь создать приложение для iOS с использованием ASIHTTPRequest, но у меня возникают некоторые проблемы с его использованием.Чтобы продемонстрировать свои проблемы, я загрузил тестовый проект, который вы можете скачать здесь: http://uploads.demaweb.dk/ASIHTTPRequestTester.zip.

Я создал класс WebService, который использует протокол ASIHTTPRequestDelegate:

#import "WebService.h"
#import "ASIHTTPRequest.h"

@implementation WebService

- (void)requestFinished:(ASIHTTPRequest *)request {
    NSLog(@"requestFinished");
}
- (void)requestFailed:(ASIHTTPRequest *)request {
    NSLog(@"requestFailed");
}

- (void) testSynchronous {
    NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    NSLog(@"starting Synchronous");
    [request startSynchronous];
    NSError *error = [request error];
    if (!error) {
        NSLog(@"got response");
    }
}

- (void) testAsynchronous {
    NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setDelegate:self];

    NSLog(@"starting Asynchronous");
    [request startAsynchronous];
}

@end

Синхронный метод работает нормально, но асинхронный не работает вообще.Сначала requestFinished и requestFailed никогда не вызывались, и сейчас я получаю EXC_BAD_ACCESS.Два метода тестирования вызываются из моего * ViewController viewDidLoad.Я надеюсь, что кто-то может помочь мне сделать эту работу.

EDIT1: Согласно этой теме , это возможно из-за Automatic Reference Counting, который включен для моего проекта,Совет по теме для добавления [self retain], но я не могу сделать это с включенным ARC.Кто-нибудь с решением для этого?

EDIT2: Обновление в соответствии с ответом от MrMage .

@interface ViewController()
@property (nonatomic,strong) WebService *ws;
@end

@implementation ViewController

@synthesize ws = _ws;

#pragma mark - View lifecycle
- (void)viewDidLoad
{
    [super viewDidLoad];

    [self setWs:[[WebService alloc] init]];
    [self.ws testSynchronous];
    [self.ws testAsynchronous];
}

@end

Ответы [ 2 ]

3 голосов
/ 03 декабря 2011

Вы можете добавить свой экземпляр WebService в качестве надежной ссылки на объект, который остается достаточно долго (скажем, на контроллере представления), а затем сказать этому классу, чтобы он избавился от WebService после того, как он выполнил свою работу (то есть в requestFinished и requestFailed вы перезваниваете контроллеру представления, говоря ему освободить экземпляр WebService).

0 голосов
/ 28 мая 2012

У меня возникла такая же проблема при делегировании с ASIHTTPRequest и ARC.

Я просто использую блоки для ее решения.

NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];

//set request like this to avoid retain cycle on blocks
__weak ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

//if request succeeded
[request setCompletionBlock:^{        
    [self requestFinished:request];
}];

//if request failed
[request setFailedBlock:^{        
    [self requestFailed:request];
}];

[request startAsynchronous];
...