如果网络状况不佳,我的应用会在进入前景时卡在图标中大约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
}
答案 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类。