2014-02-10 70 views
1

我從服務器獲取圖像時正在執行以下操作。但是這段代碼讓我的應用程序癱瘓了。它凍結了用戶界面。我可以異步UIImageJPEGRepresentation writeToFile嗎?

這可以運行在iOS的後臺線程?我可以使用異步嗎?

if (![NSString isEmpty:user.avatarURL]) 
{ 
    NSString *pathToImage = user.avatarURL; 
    NSURL *url = [NSURL URLWithString:pathToImage]; 
    NSData *data = [NSData dataWithContentsOfURL:url]; 
    UIImage *image = [[UIImage alloc] initWithData:data]; 

    [[NSUserDefaults standardUserDefaults] setObject:UIImageJPEGRepresentation(image, 1) forKey:kUserImage]; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,                        NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString* path = [documentsDirectory stringByAppendingPathComponent:@"userAvatar.png" ]; 
    NSData* jpegdata = UIImageJPEGRepresentation(image, 1); 
    [jpegdata writeToFile:path atomically:YES];           
} 
+1

我不明白爲什麼不使用'dispatch_async'。是的,你可以使用異步 –

+1

從你的代碼看起來你沒有在UI部分做任何事情,所以你可以很容易地在後臺執行此代碼。你可以使用dispatch_queues。 – IOSCODER

回答

3

正如@valentin所說的,你可以在dispatch_async()調用中的if()語句中執行所有的操作。

注意我懷疑可能會減慢你的速度實際上是-dataWithContentsOfURL:而不是UIImageJPEGRepresentation(),所以你要確保它在你的dispatch_async裏面,而不是在外面。

此外,我不清楚你爲什麼要將數據解壓縮到一個圖像,然後重新壓縮它。你會得到這樣的工件,並且對於大多數服務,頭像圖像將被壓縮。

我會做到以下幾點:

if (user.avatarURL) 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     NSURL *const imageURL = [NSURL URLWithString:user.avatarURL]; 
     if (!imageURL) 
      return; 
     NSData *const imageDdata = [NSData dataWithContentsOfURL:imageURL]; 
     if (!imageDdata.length) 
      return; 

     [[NSUserDefaults standardUserDefaults] setObject:imageDdata forKey:kUserImage]; 

     [imageDdata writeToFile:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"userAvatar.png"] atomically:YES];           
    }); 
1

這是做最損害該生產線是:

NSData *data = [NSData dataWithContentsOfURL:url]; 

因爲它從網絡上下載。代碼中的任何內容都不會更新UI,因此它可以全部在後臺線程上運行。只要確保在保存圖像後發佈通知或隨後更新UI,即可切換回主線程。

相關問題