2014-03-31 29 views
10

我想使用新的iOS7 MKMapSnapshotter來生成靜態地圖圖像。每當我的應用程序需要的地圖,我把以下內容:iOS MKMapShapshotter完成塊並不總是被稱爲

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 completion block」消息。

是否有可能我的請求永遠不會從調度隊列中執行? 有沒有人有過這個問題?

+0

您是否找到解決方案?我正面臨同樣的問題:/ –

+0

你試過用 - (void)startWithCompletionHandler:(MKMapSnapshotCompletionHandler)completionHandler? –

+0

我將首先爲您的快照員實例創建一個專用隊列。如果可靠地解決,您可能已經阻止了全局背景隊列在您應用程序的其他位置。 – nzeltzer

回答

0

由於snapshotter不是一個屬性,因此可能會出現此問題,因此它在離開此範圍後不久就會自動釋放。保留snapshotter作爲屬性應該修復它。

2

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

如果網絡數據和WiFi關閉,完成處理器將不會被調用(除非有在OS緩存數據 - 見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; 
    }]; 
} 
0

在不同的iOS版本中有相同的問題。關鍵是AppleMaps應用程序也沒有正確加載地圖。重新啓動設備使其工作。所以我想這是一個蘋果的錯誤。

0

我有同樣的問題。原因是在MKMapSnapshotOptions中我設置了很小的區域。我將delta經度和delta緯度的默認值設置爲0.05。現在它可以工作。

相關問題