慢app进入前景

时间:2016-08-19 03:12:26

标签: ios swift

如果网络状况不佳,我的应用会在进入前景时卡在图标中大约4-5秒。在几乎所有主要加载页面中,我都从服务器获取图像。 applicationDidEnterBackground()applicationWillEnterForeground()上没有任何内容。

这里是主视图控制器中的代码,其中我有一个带图像的集合视图:

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(homeReuseIdentifier, forIndexPath: indexPath)as! HomeViewCell

    // Reload the collection view after insert item at indexPath
    cvHome.reloadItemsAtIndexPaths([indexPath])

    let entry = dataCell.infoCell[indexPath.row]
    cell.backImageView.image = nil

    let stringURL = "https://.....\(entry.filename)"

    let image = UIImage(named: entry.filename)
    cell.backImageView.image = image

    if cell.backImageView.image == nil {
        if let image = dataCell.cachedImage(stringURL) {
            cell.backImageView.image = image
        } else {
            request = dataCell.getNetworkImage(stringURL) { image in
                cell.backImageView.image = image
            }
        }
    }

    cell.titleLabel.text = entry.title
    cell.authorLabel.text = entry.author

    // Fix the collection view cell in size
    cell.contentView.frame = cell.bounds
    cell.contentView.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]

    // To edit the cell for deleting
    cell.editing = editing

    return cell
}

这是Alamofire的getNetworkImage函数:

func getNetworkImage(urlString: String, completion: (UIImage -> Void)) -> (ImageRequest) {
    let queue = decoder.queue.underlyingQueue
    let request = Alamofire.request(.GET, urlString)
    let imageRequest = ImageRequest(request: request)
    imageRequest.request.response(
        queue: queue,
        responseSerializer: Request.imageResponseSerializer(),
        completionHandler: { response in
            guard let image = response.result.value else {
                return
            }
            let decodeOperation = self.decodeImage(image) { image in
                completion(image)
                self.cacheImage(image, urlString: urlString)
            }
            imageRequest.decodeOperation = decodeOperation
        }
    )
    return imageRequest
}

2 个答案:

答案 0 :(得分:0)

我不确定您的网络代码是否有问题,因为您还没有提供任何网络代码。

我的猜测是,获取数据的时间过长,并且阻止了用户界面。所以目前,您的应用是同步的。因此,任务一次执行一次。您的UI被阻止的原因是因为它必须等待网络完成。

您需要做的是在后台执行提取,并始终将您的UI保留在主队列中。

答案 1 :(得分:0)

如果你正在调用Synchronous,你必须等到任务完成。我们可以在完成当前任务后开始下一个任务。当你从服务器获取图像时,确保你是否使用Synchronous。当你不要等待Asynchronous的第二次使用。从服务器获取图像时不需要等待。从服务器获取图像时可以执行其他任务。

对于这个GCD来说是个好用的。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
    // Do the back ground process here
    ......Fetch the image here
    dispatch_async(dispatch_get_main_queue(), ^{ 
    // Update the UI here
    .....Do your UI design or updation design part here
    });
});
  

全局队列

     

这里将执行异步任务。       它不等待。       异步函数不会阻止当前执行的线程继续执行下一个函数。

     

主要排队

     

我们必须始终在主线程上访问UI Kit类。

If you don't want to wait a seconds,go with GCD