Как я могу повторить ASIHTTPRequest? - PullRequest
2 голосов
/ 03 июня 2011

Приведенный ниже пример кода:

// ExampleModel.h

@interface ExampleModel : NSObject <ASIHTTPRequestDelegate> {

}

@property (nonatomic, retain) ASIFormDataRequest *request;
@property (nonatomic, copy) NSString *iVar;

- (void)sendRequest;


// ExampleModel.m

@implementation ExampleModel

@synthesize request;
@synthesize iVar;

# pragma mark NSObject

- (void)dealloc {
    [request clearDelegatesAndCancel];
    [request release];
    [iVar release];
    [super dealloc];
}

- (id)init {
    if ((self = [super init])) {
        // These parts of the request are always the same.
        NSURL *url = [[NSURL alloc] initWithString:@"https://example.com/"];
        request = [[ASIFormDataRequest alloc] initWithURL:url];
        [url release];
        request.delegate = self;
        [request setPostValue:@"value1" forKey:@"key1"];
        [request setPostValue:@"value2" forKey:@"key2"];
    }
    return self;
}

# pragma mark ExampleModel

- (void)sendRequest {
    // Reset iVar for each repeat request because it might've changed.
    [request setPostValue:iVar forKey:@"iVarKey"];
    [request startAsynchronous];
}

@end

# pragma mark ASIHTTPRequestDelegate

- (void)requestFinished:(ASIHTTPRequest *)request {
    // Handle response.
}

- (void)requestFailed:(ASIHTTPRequest *)request {
    // Handle error.
}

Когда я делаю что-то вроде [exampleModel sendRequest] из UIViewController, это работает! Но затем я делаю [exampleModel sendRequest] снова из другого UIViewController и получаю:

Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '*** -[NSOperationQueue addOperation:]:
operation is finished and cannot be enqueued`

Как я могу это исправить?

Ответы [ 3 ]

6 голосов
/ 03 июня 2011

Вы не должны пытаться повторно использовать объект запроса.Поддерживает состояние.Действительно разработан для удаления после завершения запроса.

Конструкция не так чиста, как классы NSURLConnection, NSURLRequest, NSURLResponse (в основном все три объединены в один, а нижние базовые классы нижнего уровня ниже)Это все же намного лучше, чем использовать NSURLConnection в ванильной манере, если вам нужно иметь дело с низкоуровневыми HTTP-компонентами.Если вы этого не сделаете, у классов высокого уровня есть некоторые преимущества (например, доступ к тому же кешу, который использует UIWebView).

2 голосов
/ 03 июня 2011
1 голос
/ 03 июня 2011

ASIHTTPRequest и его подклассы соответствуют протоколу NSCopying. Просто сделай это:

 ASIFormDataRequest *newRequest = [[request copy] autorelease];
 [newRequest startAsynchronous];
...