如何检测NSURLConnection sendAsynchronousRequest是否完成
我正在使用sendAsynchronousRequest:queue:completionHandler:上传一个文件(我已经撕掉了一些旧的第三方库,以支持使用这个本地方法直接调用我已经离开了NSURLRequest和字典就是这样)。我无法弄清楚如何说明它是如何完成推送文件的。我认为在完成处理程序中会定期调用,并且我们可以检查通过的参数,但它们似乎并不包含我需要的东西。如何检测NSURLConnection sendAsynchronousRequest是否完成
- (void)sendToServer:(NSString*)url asset:(MYAsset *)asset path:(NSString *)file completion:(MYUploaderBoolBlock)completion{
NSDictionary *uploadParameters = asset.s3Info;
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:uploadParameters[@"my_url"]]];
request.HTTPMethod = @"PUT";
request.timeoutInterval = 300;
[request addValue:uploadParameters[@"date"] forHTTPHeaderField:@"Date"];
[request addValue:uploadParameters[@"authorization"] forHTTPHeaderField:@"Authorization"];
[request addValue:uploadParameters[@"content_type"] forHTTPHeaderField:@"Content-Type"];
[request addValue:asset.md5 forHTTPHeaderField:@"Content-MD5"];
[request addValue:@"public-read" forHTTPHeaderField:@"x-amz-acl"];
[request addValue:[@(asset.sizeInKB) stringValue] forHTTPHeaderField:@"Content-Length"];
request.HTTPBodyStream = [NSInputStream inputStreamWithFileAtPath:file];
DDLogInfo(@"Uploading %@ to server", uploadParameters[@"my_url"]);
DDLogInfo(@"HTTP Headers: %@", [request allHTTPHeaderFields]);
[NSURLConnection sendAsynchronousRequest:request
queue:self.queue
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){
if ([data length] > 0 && error == nil){
// I am expecting that this can be used to detect progress of the file upload
// as well as completion?
NSLog(@"received data %d/%d =%f%", data.length, response.expectedContentLength, data.length/(float)response.expectedContentLength);
if(data.length == response.expectedContentLength){
// This never fires because expectedContentLength is always -1
completion(YES);
}
}
else if ([data length] == 0 && error == nil){
NSLog(@"reply empty");
}
else if (error != nil && error.code == -1001){
NSLog(@"timed out");
}
else if (error != nil){
NSLog(@"Error %@", error.localizedDescription);
completion(NO);
}
}];
}
根据该documentation,完成处理器块在所述异步发送的结束调用一次。
如果error
为零,操作成功(不知道为什么测试数据长度)。
啊,我的错。我忽略了它在“请求完成或失败时排队”的地方。“谢谢你收到。 由于提供此功能的委托方法在iOS 4.3周围完全弃用,因此如何监视上载的进度?它没有看到此类中提供该功能的任何方法。 – VaporwareWolf 2013-04-26 21:48:28
再次查看文档(对于OSX),看起来他们将这些代表放在OSX中,但不在iOS中。文档在这里:http://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSURLConnectionDelegate_Protocol/Reference/Reference.html – VaporwareWolf 2013-04-26 21:50:11
啊,我看到有一个不同的类使用。这看起来像我正在寻找的东西。 http://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSURLConnectionDownloadDelegate_Protocol/NSURLConnectionDownloadDelegate/NSURLConnectionDownloadDelegate.html – VaporwareWolf 2013-04-26 21:54:08
怎么样使用NSURLConnection? ..然后使用它的delegate methods
或使用ASIHTTPRequest框架
我正在使用NSURLConnection。您正在讨论的委托方法不包括在iOS 4.3之后。还有其他一些方法,但它们不提供所需的功能。 ASIHTTPRequest不在积极开发或支持。我正在修改的代码实际上已经在使用GTM fetcher,但是我正在寻找删除该库,如果它可以使用本机代码。 – VaporwareWolf 2013-04-27 21:43:26
我肯定一直用快乐[AFNetworking](https://github.com/AFNetworking/AFNetworking/blob/master/ AFNetworking/AFHTTPClient.m)的东西。 – HalR 2013-04-27 21:13:43