具有合理反馈的原子异步HTTP文件POST?

Dan*_*ani 8 macos upload cocoa http objective-c

我刚开始在Mac上开发并且发现Cocoa是一个有用且周到的框架,但它的HTTP功能让我感到困惑.

我有一个NSURLConnection对象,使用HTTP GET方法从我的web服务器下载文件.NSURLConnect的异步连接非常好,我得到了很多反馈,我将每个块作为一个新的NSData对象接收,我可以用来在客户端自动重建文件,更重要的是,为用户提供进度报告:[myData length ].

然而,上传远没有那么整洁.您既可以在自己的线程中粘贴同步请求,也可以调用异步请求(我相信它会生成自己的线程),但是它们都没有为您提供任何有用的反馈.没有代表请求数据,甚至不知道何时发送数据.据推测,这限制了我的文件小于可用内存.

因此,我的问题是,使用Cocoa的HTTP POST文件上传是否有一个简单而优雅的解决方案,它提供了大量的反馈和逐个读取文件的能力,而不是一次性读取所有文件?或者我应该从低级网络功能编写自己的类?

谢谢!

bbr*_*own 5

您可能想要查看ASIHTTPRequest框架.我没有用它来上传,但看起来它有更多的反馈,而且使用非常简单.


seh*_*ugg 2

我决定使用 CFNetwork 函数而不是 NSURLConnection。异步通知和特定功能(例如身份验证)似乎更加灵活。不幸的是,它有点复杂(例如运行循环让我大吃一惊),所以如果你走这条路,我建议你阅读 CFNetwork 参考指南:

http://developer.apple.com/documentation/Networking/Conceptual/CFNetwork/Introduction/Introduction.html

这是我的 POST 例程 FWIW 中的一段代码:

// Create our URL
CFStringRef url = CFSTR("Submit");
CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, url, baseUrl);

// Create the message request (POST)
CFStringRef requestMethod = CFSTR("POST");
CFHTTPMessageRef myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, requestMethod, myURL, kCFHTTPVersion1_1);

// Connect the read socket to the HTTP request stream
CFReadStreamRef myReadStream = CFReadStreamCreateForStreamedHTTPRequest(kCFAllocatorDefault, myRequest, readStream);
// TODO: why does this have to be done?
succ &= CFReadStreamSetClient(myReadStream,
  kCFStreamEventOpenCompleted | kCFStreamEventCanAcceptBytes | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered,
  (CFReadStreamClientCallBack) &MyReadCallBack, &myClientContext);
CFReadStreamScheduleWithRunLoop(myReadStream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
succ &= CFReadStreamOpen(myReadStream);
Run Code Online (Sandbox Code Playgroud)