Ios 在UIScrollview中更新子视图时在滚动期间轻微冻结

Ios 在UIScrollview中更新子视图时在滚动期间轻微冻结,ios,swift,asynchronous,uiscrollview,Ios,Swift,Asynchronous,Uiscrollview,当用户向下滚动到页面的某个百分比时,我会发回数据库以获取更多数据。但是,当使用数据更新子视图时,我注意到滚动中有一点冻结。我不确定我做错了什么,因为所有的调用都是异步的 func PostBackAsync(PassURL:String, username:String, completion: (jsonData: NSDictionary?, error: NSError?)->Void) { let post:NSString = "username=\(username)

当用户向下滚动到页面的某个百分比时,我会发回数据库以获取更多数据。但是,当使用数据更新子视图时,我注意到滚动中有一点冻结。我不确定我做错了什么,因为所有的调用都是异步的

func PostBackAsync(PassURL:String, username:String, completion: (jsonData: NSDictionary?, error: NSError?)->Void) {

    let post:NSString = "username=\(username)";
    let url:NSURL = NSURL(string:PassURL)!
    let postData = post.dataUsingEncoding(NSUTF8StringEncoding)!

    let postLength = String(postData.length)
    //Setting up `request` is similar to using NSURLConnection
    let request = NSMutableURLRequest(URL: url)
    request.HTTPMethod = "POST"
    request.HTTPBody = postData
    request.setValue(postLength, forHTTPHeaderField: "Content-Length")
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    request.setValue("application/json", forHTTPHeaderField: "Accept")


    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithRequest(request) {urlData, response, reponseError in

        if let receivedData = urlData {
            let res = response as! NSHTTPURLResponse!;

            NSLog("Response code: %ld", res.statusCode);

            if (res.statusCode >= 200 && res.statusCode < 300) {
                do {
                    let jsonData = try NSJSONSerialization.JSONObjectWithData(receivedData, options: []) as! NSDictionary
                    //On success, invoke `completion` with passing jsonData.
                    completion(jsonData: jsonData, error: nil)
                } catch {
                    //On error, invoke `completion` with NSError.
                    completion(jsonData: nil, error: nil)
                }                      }
            else
            {
                completion(jsonData: nil, error: nil)
            }
        }
    }
    task.resume()
} 

 func PostBack(PassURL:String, username:String) {
    PostBackAsync(PassURL, username: username) {jsonData, error in
        if let json = jsonData {

            dispatch_async(dispatch_get_main_queue(), {

                let success:NSInteger = json.valueForKey("success") as! NSInteger

                if(success == 1)
                {
                   for var index=0; index < myArray.count; index++
                    {

                    //Do some Data Manipulation...
                    //..............
                     self.newView.addSubview(a[index] as! String)       
                     self.newView.addSubview(b[index] as! String)
                  self.myScrollView.contentSize = CGSize(width: aWidth, height: myscrollViewContentSize)
                  //newView is the main subview inside of the scrollview
                  self.newView.frame = CGRectMake(0, 0, self.myScrollView.frame.width, myscrollViewContentSize)
}
}
}) }}
func PostBackAsync(PassURL:String,username:String,completion:(jsonData:NSDictionary?,错误:NSError?)->Void){
让post:NSString=“username=\(username)”;
让url:NSURL=NSURL(字符串:PassURL)!
让postData=post.dataUsingEncoding(NSUTF8StringEncoding)!
让postLength=字符串(postData.length)
//设置“请求”类似于使用NSURLConnection
let request=NSMutableURLRequest(URL:URL)
request.HTTPMethod=“POST”
request.HTTPBody=postData
request.setValue(postLength,forHTTPHeaderField:“内容长度”)
request.setValue(“application/x-www-form-urlencoded”,forHTTPHeaderField:“内容类型”)
request.setValue(“application/json”,forHTTPHeaderField:“Accept”)
let session=NSURLSession.sharedSession()
让task=session.dataTaskWithRequest(请求){urlData,response,reponserror in
如果let receivedData=urlData{
让res=响应为!NSHTTPURLResponse!;
NSLog(“响应代码:%ld”,res.statusCode);
如果(res.statusCode>=200&&res.statusCode<300){
做{
让jsonData=try NSJSONSerialization.JSONObjectWithData(receivedData,选项:[])作为!NSDictionary
//成功后,通过传递jsonData调用“completion”。
完成(jsonData:jsonData,错误:nil)
}抓住{
//出现错误时,使用NSError调用“completion”。
完成(jsonData:nil,错误:nil)
}                      }
其他的
{
完成(jsonData:nil,错误:nil)
}
}
}
task.resume()
} 
func回发(PassURL:String,username:String){
PostBackAsync(PassURL,用户名:username){jsonData,错误在
如果让json=jsonData{
dispatch\u async(dispatch\u get\u main\u queue(){
让success:NSInteger=json.valueForKey(“success”)作为!NSInteger
如果(成功==1)
{
对于var index=0;index


更新此信息时,UIScrollview滚动条是否会略微冻结?

您可能需要定义要在其上运行异步操作的线程,以确保它不在UI线程上运行。请参阅以下回答:

您可能需要定义要在其上运行异步操作的线程,以确保它没有在UI线程上运行。请参见以下回答:

您需要确保调用函数的频率足够高,以便始终为表中的当前位置预加载数据+X个单元格。即使如此,根据您绘制单元格和准备重用的方式,也可能导致stutters@LouisTur我只是在添加新的数据o使用最后一个项目的原点+30来显示滚动的底部。然后我相应地调整contentsize。这不是一个tableview,所以我不使用单元格…?为什么不在更新内容之前等待滚动视图不再滚动来解决它呢?@matt,因为我想避免用户到达s的底部crollview,除非数据库中不再有数据。每次用户到达70%的位置时,我都会用更多的内容更新scrollview。您需要确保调用函数的频率足够高,以便始终为表中的当前位置预加载数据+X个单元格。即使如此,这取决于您的操作方式绘制单元格并准备重用,这可能会导致stutters@LouisTur我只是使用最后一个项目的原点+30将新数据添加到滚动的底部。然后我相应地调整contentsize。这不是一个tableview,所以我不使用单元格…?为什么不在开始之前等待滚动视图不再滚动来解决它呢你要更新它的内容吗?@matt因为我想避免用户到达scrollview的底部,除非数据库中不再有数据。每次用户到达70%的位置时,我都会用更多的内容更新scrollview。我尝试将dispatch\u async(dispatch\u get\u global\u)放入队列(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),{在多个位置上,但我仍然有相同的问题和/或正在创建其他问题。是否知道将此工作线程放置在何处?
DISPATCH_QUEUE_PRIORITY_DEFAULT
但这完全错误。更新接口必须在主线程上完成。@matt我目前正在使用DISPATCH_async(调度获取主队列(),{在我的原始代码中,但在视图更新期间,我会在滚动过程中冻结1-2秒。@SlopTonio您是否确实知道在更新视图时会发生冻结?或者可能是在触发数据提取时发生冻结?您是否正确使用可重用单元格来避免为每个单元格生成子视图?我已尝试MPT试图将dispatch_async(dispatch_get_global_queue(dispatch_queue_PRIORITY_DEFAULT,0))放置在多个位置上,但我仍然有相同的问题和/或正在创建其他线程。知道将此工作线程放置在何处吗?
DISP