Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift中的HTTP长轮询_Ios_Swift_Grand Central Dispatch_Nsurlsession_Long Polling - Fatal编程技术网

Ios Swift中的HTTP长轮询

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

我正在尝试使用iOS 8+在Swift中实现一个长轮询解决方案

虽然这个解决方案毫无疑问是可行的,并且让主线程可以自由地进行UI交互,但内存使用率不断攀升,所以我显然做错了什么。我写的课程如下:

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内存监视器-始终使用仪器