ios - Every 11th execution of NSURLSessionTask takes much longer than others -
i'm having strange behavior in swift app, don't understand.
i have subclassed nsoperation create different operations can call rest-webservices via nsurlsession / nsurlsessiontask. works fine in general.
in case have execute many of these operations successively. let's create "chain" of 30 nsoperations setting dependencies execute them 1 one.
now reproduce behavior, every 11th (?!) execution of such operation, takes longer others. seems if execution "sleeps" 10 seconds before goes on. can rule out, concrete web service call issue. because if change order of execution, still 11th operation "hangs".
currently creating new instance of nsurlsession (defaultconfiguration) during execution of every operation. yesterday tried create static instance of nsurlsession , create instances of nsurlsessiontask during execution only. , "hanger" gone! unfortunately not way, because nsurlsessiondelegate has different operations, delegate must passed during initialization.
did experience similar behavior?
first thought code complex post. after ketans comment, give try. have trimmed down important parts. hope helps show problem. if need more detail, please let me know.
class abstractwebserviceoperation: nsoperation { // variant 2: create static nsurlsession once --> "sleep" not occur! static let session = nsurlsession(configuration: nsurlsessionconfiguration.defaultsessionconfiguration()) init(servicepath:string, httpmethod:string) { // 'abstract' class, subclassed concrete webservice calls differ in servicepath url, http method , parameters } // override start() function of nsoperation webservice call. nsoperations vars (ready, executing, finished) overridden too, nsoperation "waiting" webservice result. don't think relevant issue. did leave out. override func start() { super.start() // [...] if let request = createrequest() { let task = createtask(request) task.resume() } // [...] } // creates concrete nsurlrequest using service path , http method defined concrete subclass. private func createrequest()-> nsmutableurlrequest? { // [...] let webserviceurl = "https://\(self.servicepath)" let url = nsurl(string: webserviceurl) let request = nsmutableurlrequest(url: url!) request.timeoutinterval = 60 request.httpmethod = self.httpmethod request.addvalue("application/json;charset=utf-8", forhttpheaderfield: "content-type") request.addvalue("application/json;charset=utf-8", forhttpheaderfield: "accept") return request; } // creates concrete nsurlsessiontask given nsurlrequest (using completionhandler defined getcompletionhandler()) func createtask(request:nsurlrequest) -> nsurlsessiontask { // variant 1: create new nsurlsession every time abstractwebserviceoperation executed --> "sleep" occurs! let session = nsurlsession(configuration: nsurlsessionconfiguration.defaultsessionconfiguration(), delegate: nil, delegatequeue: nil) return session.datataskwithrequest(request, completionhandler:getcompletionhandler()) // variant 2: create static nsurlsession once --> "sleep" not occur! return abstractwebserviceoperation.session.datataskwithrequest(request, completionhandler:getcompletionhandler()) } // returns completion handler nsurlsessiontask (may overriden in subclass) func getcompletionhandler() -> (nsdata?, nsurlresponse?, nserror?) -> void { return completionhandler } // default completion handler lazy var completionhandler:(nsdata?, nsurlresponse?, nserror?) -> void = {(data : nsdata?, response : nsurlresponse?, error : nserror?) in // default completion handling } }
awww... forgot call session.finishtasksandinvalidate() invalidate session after webservice call done.
that solves problem!
Comments
Post a Comment