【问题标题】:objective-c Replacing NSMutableURLRequest with ASIHTTPRequestObjective-c 用 ASIHTTPRequest 替换 NSMutableURLRequest
【发布时间】:2015-04-04 00:06:16
【问题描述】:

我正在尝试用ASIHTTPRequest 替换我的NSMutableURLRequest,我尝试了以下操作,但是当我尝试此操作时,我的应用程序崩溃了。我没有收到任何错误,只是一个警告:

不兼容的指针类型将“ASIHTTPRequest *”发送到“NSURLRequest *”类型的参数

我该如何解决这个问题,我尝试过的内容如下,我已经注释掉了我要替换的内容:

receivedData = [[NSMutableData alloc]init];
//NSURL *JSONURL = [NSURL URLWithString:url];

NSURL *url = [NSURL URLWithString:url];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setUseSessionPersistence:YES];
[request setUseKeychainPersistence:NO];
[request setUsername:@"username"];
[request setPassword:@"password"];
[request setDomain:@"domain"];
[request startSynchronous];

//NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:JSONURL];
jobsConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[jobsConnection start];

额外代码:

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    [receivedData appendData:data];
}

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{

    //NSLog(@"%@" , error);
    communityDictionary = nil;
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSError *myError;
    if([connection isEqual:jobsConnection])
    {
        communityDictionary = [[NSDictionary alloc]initWithDictionary:
                               [NSJSONSerialization JSONObjectWithData:receivedData options:kNilOptions error:&myError]];
    }

}

【问题讨论】:

  • 真的,你要使用dead library吗?
  • 我不鼓励你使用ASIHTTPRequest。如果你想使用第三方库,现在很多人都倾向于AFNetworking
  • 这是一个可怕的决定……说真的。我也劝阻 AFNetworking 顺便说一句.... 强烈劝阻它,但这个特殊的库是不要使用的。

标签: ios objective-c asihttprequest nsmutableurlrequest


【解决方案1】:

你真的不想使用这段代码。

//receivedData = [[NSMutableData alloc]init]; // <-- Not needed
//NSURL *JSONURL = [NSURL URLWithString:url];

NSURL *url = [NSURL URLWithString:url];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setUseSessionPersistence:YES];
[request setUseKeychainPersistence:NO];
[request setUsername:@"username"];
[request setPassword:@"password"];
[request setDomain:@"domain"];
[request startSynchronous];

// You are already done getting the request, you just need to handle the response.
NSError *error = [request error];
if (!error) {
    // Put the response data into your received data object.
    receivedData = [[request responseData] mutableCopy];
    // TODO: copy in the code from -connectionDidFinishLoading:
} else {
    NSLog(@"%@", error);
}

// There is no need to do anything with NSURLConnection.
//NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:JSONURL];
//jobsConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
//[jobsConnection start];

[request startSynchronous] 已经执行了请求并收到了响应,您需要做的就是从 ASI 对象中获取响应。注意:不会进行任何-connection:didReceiveResponse:-connection:didReceiveData:-connectionDidFinishLoading: 回调,在-connectionDidFinishLoading: 中完成的任何工作都需要在我上面放置的TODO: 部分中完成。


注意:这是错误的代码。 -startSynchronous 阻塞线程直到请求完成。这将锁定您的 UI,直到响应完成。

  • 不要使用-startSynchronous 看看-startAsynchronous
  • 不要使用ASIHTTPRequest,使用AFNetworking
  • 想一个更好的方法来重构这个解决方案!

【讨论】:

  • 我做可用的连接方法....我怎么称呼它们?我正在尝试您的示例,看来我走在正确的轨道上,但我只是不知道下一步该做什么。我将我的连接方法添加到问题中
【解决方案2】:

我确实从 iPhone Xcode 项目 (https://github.com/pokeb/asi-http-request) 的 PerformanceTests.m 中复制了一些代码:

- (void)startASIHTTPRequests
{
    bytesDownloaded = 0;
    [self setRequestsComplete:0];
    [self setTestStartDate:[NSDate date]];
    int i;
    for (i=0; i<10; i++) {
        ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:testURL];
        //Send the same headers as NSURLRequest
        [request addRequestHeader:@"Pragma" value:@"no-cache"];
        [request addRequestHeader:@"Accept" value:@"*/*"];
        [request addRequestHeader:@"Accept-Language" value:@"en/us"];
        [request setDelegate:self];
        [request startAsynchronous];
    }
}    

- (void)requestFailed:(ASIHTTPRequest *)request
{
    GHFail(@"Cannot proceed with ASIHTTPRequest test - a request failed");
}

- (void)requestFinished:(ASIHTTPRequest *)request
{
    bytesDownloaded += [[request responseData] length];
    requestsComplete++;
    if (requestsComplete == 10) {
        NSLog(@"ASIHTTPRequest: Completed 10 (downloaded %lu bytes) requests in %f seconds",bytesDownloaded,[[NSDate date] timeIntervalSinceDate:[self testStartDate]]);
    }
}

希望对你有帮助。

【讨论】:

  • 确实如此,我添加了 addRequestHeader 但我仍然收到该警告并且我的应用程序崩溃了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 2023-03-08
  • 2011-07-28
  • 2012-07-06
相关资源
最近更新 更多