2016-07-07 5 views
0

私たちは、セルが現れたときに生成されるマップスナップショットを含むUITableViewを持つiOSアプリケーションを持っています。使用しているサンプルリストは、単純にModelクラスで提供されている緯度/経度に基づいてマップスナップショットを表示しています。私はメモリクラッシュに気付き始めたので、コードを最小限に減らしました。結果が完了してもスナップショットを実行していないときにもクラッシュが発生します。当社独自のセルに含まれているとcellForItemAtIndexPathメソッドを介して呼び出されるコード、については、以下を参照してください。MKMapSnapshotterメモリクラッシュ - UITableViewの複数の呼び出し

private func testMapSnapshot(viewModel: StreamViewModel) 
{ 
    let latDelta:CLLocationDegrees = 0.005 
    let lonDelta:CLLocationDegrees = 0.005 

    let span:MKCoordinateSpan = MKCoordinateSpanMake(latDelta, lonDelta) 
    let location:CLLocationCoordinate2D = CLLocationCoordinate2DMake(viewModel.coordinate.latitude, viewModel.coordinate.longitude) 
    let region:MKCoordinateRegion = MKCoordinateRegionMake(location, span) 

    let options = MKMapSnapshotOptions() 
    options.region = region 
    options.size = mapImageView.frame.size 
    options.scale = UIScreen.mainScreen().scale 

    viewModel.mapSnapshotter = MKMapSnapshotter(options: options) 
    viewModel.mapSnapshotter!.startWithCompletionHandler() { snapshot, error in 
     // do nothing 
    } 
} 

didEndDisplayingCellでは、私はmapSnapshotterを解除してください作っています。 (私たちはテーブルビューが含まれている私たちの主なVCクラスのモデルのリストを保持)の参照を参照してください:この最後のステップを実行する前に、それが道先にクラッシュしたこと

func collectionView(collectionView: UICollectionView, didEndDisplayingCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) 
    let model = viewModel?[indexPath.item] { 
     model.mapSnapshotter?.cancel() 
     model.mapSnapshotter = nil 
    } 
} 

注意。しかし今、リストをすばやくスクロールし始めると、吃音が始まり、吃音を止めません。約150行のリストを上下に移動すると、メモリ警告が表示されてからクラッシュする前に30秒以内で完了します。

これをInstrumentsで実行しましたが、それほど役に立ちませんでした。ヒープと匿名のVM割り当てが徐々に増加しているように見え、クラッシュが発生する可能性があります。参考のために参照してください: MKMapSnapshotter uses incredible amounts of CPU & RAMをしかし、それは未回答だとメモリが解放されない理由は、実際に対応していません:

Instruments Screenshot

私はそこにこの記事を見ました。

これはどこに行こうと思っていますか?事前にありがとう、私は詳細を提供できるかどうか私に知らせてください。

答えて

1

私はこの特定の問題の修正を見つけることができませんでしたが、スクロールビューが停止したときにのみmap snapshotterを呼び出すことで解決できました。この方法では、cellForRowメソッドを使用してリストをスクロールダウンする際に、このAPIの呼び出し回数を最小限に抑え、メモリの問題を防ぐことができます。

+0

MkSnapshotterは非同期です。ですから、あなたがスナップショットを撮っているものはスナップショットでなければなりません。これはおそらくあなたの修正が働く理由です。メモリの観点からは、オブジェクトを作成するときにOSがメモリを割り当てる必要があります(おそらく古いコードでメモリの問題が発生した理由)。 Fyi、cancel()は実際にスナップショットプロセスを開始した場合にのみ機能します。 – goggelj

関連する問題