2013-02-10 36 views
0

我有一種方法將圖像保存到文檔目錄。看起來像這樣:保存到帶完成塊的文檔目錄?

+(void)saveImageInDocumentsDirectory:(UIImage *)image withImageName:(NSString *)name { 
    NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString * basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; 
    NSData * binaryImageData = UIImagePNGRepresentation(image); 
    [binaryImageData writeToFile:[basePath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png",name]] atomically:YES]; 
} 

有沒有一種方法來添加一個完成塊到這個,它會在圖像保存時運行?

回答

2

我不認爲有一個完成塊。根據該文件,返回值表明

返回值 是如果操作成功,否則NO。

對我來說,這意味着該方法會阻止它被調用的線程,直到它完成。 如果您的保存需要一段時間,您可以使用Grand Central Dispatch在單獨的線程中執行操作。當你的方法返回時,你可以調用一個方法作爲完成塊。尋找dispatch_async,你應該找到很多。

這裏也有很多關於SO的例子。例如: Dealing with Blocks, completion handlers, dispatch_async vs dispatch_sync

希望這有助於!

1

您可以在代表完成塊的方法中添加一個附加參數。但是,沒有意義。這裏涉及的代碼都不是異步的。當您調用此方法時,方法返回時,寫入操作已完成。因此,爲完成塊添加支持並不會帶來任何收益。

因此,而不是增加支持完成塊,使這樣一個電話:

[Whatever saveImageInDocumentsDirectory:someImage withImageName:@"SomeName" completion:^{ 
    // some completion code 
}]; 

你只需要做到這一點:

[Whatever saveImageInDocumentsDirectory:someImage withImageName:@"SomeName"]; 
// some completion code here 
+0

謝謝,你是對的。我將實現這兩​​個答案的組合 - 在後臺線程上運行保存,然後在方法末尾彈出一些內容以通知UI已完成保存。 – 2013-02-11 12:50:19