簡體   English   中英

iOS MKMapShapshotter 完成塊並不總是被調用

[英]iOS MKMapShapshotter completion block is not always being called

我正在嘗試使用新的 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;
}

在大多數情況下,這很好用。 但是有時,設備似乎因地圖請求而過載,然后停止渲染。 在我的日志文件中,我將看到關於“已分配快照程序”的第一條日志語句,但從未看到“快照程序完成塊”消息。

是否有可能我的請求永遠不會在調度隊列之外執行? 有沒有人遇到過這個問題?

這是(或似乎是)MKMapSnapshotter 中的一個錯誤。

如果網絡數據和 WiFi 關閉,則不會調用完成處理程序(除非操作系統中有緩存數據 - 請參閱https://stackoverflow.com/a/5769108/481207以清除緩存)。

事實上,快照程序似乎阻止等待數據。 它不會超時或檢測到沒有數據。 幾分鍾后,例如 15 分鍾, snapshotter.isLoading = YES 調用cancel不會導致調用完成處理程序。

如果 WiFi 或網絡數據重新打開,啟動(新)快照程序的后續調用將調用完成處理程序。

如果在快照程序啟動並在處理程序中清除時設置了一個變量,這會很糟糕,因為該變量永遠不會被清除。

if (!isRendering) {
    isRendering = YES;

    [snapshotter startWithCompletionHandler:
     ^(MKMapSnapshot* snapshot, NSError* error) {
         // This may not be called so this code will
         // never run again.
         isRendering = NO;
     }];
}

由於快照程序不是屬性,因此可能會出現此問題,因此它在離開此范圍后很快就會自動發布。 將快照程序保留為屬性應該可以修復它。

在不同的 iOS 版本中遇到了同樣的問題。 關鍵是 AppleMaps 應用程序也沒有正確加載地圖。 重新啟動設備很難讓它工作。 所以我想這是一個蘋果的錯誤。

我有同樣的問題。 原因是在 MKMapSnapshotOptions 中,我設置了非常小的區域。 我將 delta longitude 和 delta latitude 的默認值設置為 0.05。 現在它起作用了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM