11

新しい iOS7 MKMapSnapshotter を使用して静的なマップ イメージを生成しようとしています。アプリでマップが必要になるたびに、次のように呼び出します。

MKMapSnapshotter *snapshotter = [[[MKMapSnapshotter alloc] initWithOptions:theOptions] autorelease];
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
DebugLog(@"Snapshotter allocated %@ and run on queue %@", snapshotter, aQueue);

[snapshotter startWithQueue:aQueue completionHandler:^(MKMapSnapshot *snapshot, NSError *error) {
    DebugLog(@"Snapshotter completion block %@", snapshotter);
    // perform selector on main thread to set self.imageView.image = shanpshot.image;
}

ほとんどの場合、これはうまく機能しています。ただし、マップのリクエストでデバイスが過負荷になり、レンダリングが停止する場合があります。私のログ ファイルには、「Snapshotter が割り当てられました」という最初のログ ステートメントが表示されますが、「Snapshotter 完了ブロック」メッセージは表示されません。

リクエストがディスパッチ キューの外で決して実行されない可能性はありますか? 誰もこの問題を抱えたことがありますか?

4

4 に答える 4

2

これは、MKMapSnapshotter のバグです (またはそのように見えます)。

ネットワーク データと WiFi がオフになっている場合、完了ハンドラーは呼び出されません(OS にキャッシュされたデータがない限り、キャッシュのクリアについてはhttps://stackoverflow.com/a/5769108/481207を参照してください)。

実際、スナップショット作成者はデータの待機をブロックしているように見えます。タイムアウトしたり、データがないことを検出したりしません。数分後、たとえば 15 分後、snapshotter.isLoading = YES. 呼び出しcancelによって、完了ハンドラーが呼び出されることはありません。

WiFi またはネットワーク データがオンに戻った場合、(新しい) スナップショット作成者を開始するための後続の呼び出しは、完了ハンドラーを呼び出します。

変数が決してクリアされないため、snapshotter が開始され、ハンドラーでクリアされるときに変数が設定されている場合、これはひどく失敗します。

if (!isRendering) {
    isRendering = YES;

    [snapshotter startWithCompletionHandler:
     ^(MKMapSnapshot* snapshot, NSError* error) {
         // This may not be called so this code will
         // never run again.
         isRendering = NO;
     }];
}
于 2015-09-02T05:50:49.983 に答える
0

異なる iOS バージョンで同じ問題が発生しました。ポイントは、AppleMaps アプリもマップを適切にロードしなかったことです。デバイスを再起動すると、機能するようになりました。だから私はそれがAppleのバグだと思います。

于 2016-06-02T14:55:01.357 に答える
0

この問題は、snapshotter がプロパティではないために発生している可能性があり、このスコープを離れた直後に自動解放されます。プロパティとしてスナップショットを保持すると、修正されるはずです。

于 2015-07-26T00:52:10.113 に答える