Ios Swift中的HTTP长轮询
我正在尝试使用iOS 8+在Swift中实现一个长轮询解决方案 虽然这个解决方案毫无疑问是可行的,并且让主线程可以自由地进行UI交互,但内存使用率不断攀升,所以我显然做错了什么。我写的课程如下:Ios Swift中的HTTP长轮询,ios,swift,grand-central-dispatch,nsurlsession,long-polling,Ios,Swift,Grand Central Dispatch,Nsurlsession,Long Polling,我正在尝试使用iOS 8+在Swift中实现一个长轮询解决方案 虽然这个解决方案毫无疑问是可行的,并且让主线程可以自由地进行UI交互,但内存使用率不断攀升,所以我显然做错了什么。我写的课程如下: enum LongPollError:ErrorType{ case IncorrectlyFormattedUrl case HttpError } public class LongPollingRequest: NSObject { var GlobalUserIniti
enum LongPollError:ErrorType{
case IncorrectlyFormattedUrl
case HttpError
}
public class LongPollingRequest: NSObject {
var GlobalUserInitiatedQueue: dispatch_queue_t {
return dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.rawValue), 0)
}
var GlobalBackgroundQueue: dispatch_queue_t {
return dispatch_get_global_queue(Int(QOS_CLASS_BACKGROUND.rawValue), 0)
}
var longPollDelegate: LongPollingDelegate
var request: NSURLRequest?
init(delegate:LongPollingDelegate){
longPollDelegate = delegate
}
public func poll(endpointUrl:String) throws -> Void{
let url = NSURL(string: endpointUrl)
if(url == nil){
throw LongPollError.IncorrectlyFormattedUrl
}
request = NSURLRequest(URL: url!)
poll()
}
private func poll(){
dispatch_async(GlobalBackgroundQueue) {
self.longPoll()
}
}
private func longPoll() -> Void{
autoreleasepool{
do{
let urlSession = NSURLSession.sharedSession()
let dataTask = urlSession.dataTaskWithRequest(self.request!, completionHandler: {
(data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in
if( error == nil ) {
self.longPollDelegate.dataReceived(data)
self.poll()
} else {
self.longPollDelegate.errorReceived()
}
})
dataTask.resume()
}
}
}
}
我曾尝试在Instruments中评测该应用程序,但结果令人困惑。我希望有人能给我指出正确的方向
谢谢Longpoll代理功能强大,因此您有一个保留周期。将其设为弱变量。LongPollDelegate是强变量,因此您可能有一个保留周期。试着让它变弱。很明显,长时间的HTTP轮询会提高内存使用率。显然这不是一个好主意。所以,套接字的魔力就来了…看看套接字编程,或者使用一些API,比如PusherThanks,来评论@anishparajuli,但为什么它是显而易见的呢?从上面的代码示例中,您会将提升的内存占用归因于何处?重复的操作并不一定意味着内存使用量的增加(我认为上面的David H已经强调了这个问题)。我同意你的观点,但我看不出像Pusher这样的API有什么相关性——你介意详细说明一下吗?感谢您关于内存的建议。那么您需要声明LongPollDelegate为弱代理是正确的。考虑到轮询API会持续使用CPU、资源……因此,使用套接字可以优化您以单个数据包的形式请求服务器的方式,而不是发出HTTP请求。@DavidH-您是正确的。这解决了问题-你想发布一个答案,这样我就可以标记它为正确的吗?另外,请注意不要太注意Xcode内存监视器-始终使用仪器