Dan*_*ani 8 macos upload cocoa http objective-c
我刚开始在Mac上开发并且发现Cocoa是一个有用且周到的框架,但它的HTTP功能让我感到困惑.
我有一个NSURLConnection对象,使用HTTP GET方法从我的web服务器下载文件.NSURLConnect的异步连接非常好,我得到了很多反馈,我将每个块作为一个新的NSData对象接收,我可以用来在客户端自动重建文件,更重要的是,为用户提供进度报告:[myData length ].
然而,上传远没有那么整洁.您既可以在自己的线程中粘贴同步请求,也可以调用异步请求(我相信它会生成自己的线程),但是它们都没有为您提供任何有用的反馈.没有代表请求数据,甚至不知道何时发送数据.据推测,这限制了我的文件小于可用内存.
因此,我的问题是,使用Cocoa的HTTP POST文件上传是否有一个简单而优雅的解决方案,它提供了大量的反馈和逐个读取文件的能力,而不是一次性读取所有文件?或者我应该从低级网络功能编写自己的类?
谢谢!
我决定使用 CFNetwork 函数而不是 NSURLConnection。异步通知和特定功能(例如身份验证)似乎更加灵活。不幸的是,它有点复杂(例如运行循环让我大吃一惊),所以如果你走这条路,我建议你阅读 CFNetwork 参考指南:
这是我的 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)
| 归档时间: |
|
| 查看次数: |
3955 次 |
| 最近记录: |