2012-01-02 185 views
1

我有這樣的代碼時,我建立調試我的手機和模擬器(我的手機上使用模擬器上的iOS 4.0和iOS 5.0)上工作。但是,每當我做了一個特設的構建和安裝我的手機上,它充當如果將圖像保存,但顯示一個空白區裏的形象應該是。所以我不認爲這是一個權限問題,因爲我首先檢查是否有圖像文件要顯示,如果沒有,我顯示一個默認圖片。所以,如果它是一個權限問題,就無法保存文件名代碼覺得有可顯示文件,並會顯示默認。這裏是我當前的代碼:圖像保存到iPhone應用程序

+(void)downloadImage:(id)image_path { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; 

    NSString *urlString = [NSString stringWithFormat: @"http://www.vegashipster.com/%@",image_path];       
    NSData *imageData = [[NSData alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]]]; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); 
    NSString *libraryDirectory = [paths objectAtIndex:0]; 

    NSString *myFilePath = [libraryDirectory stringByAppendingPathComponent:image_path]; 
    NSString *hotelsPath = [libraryDirectory stringByAppendingPathComponent:@"images/hotels"]; 

    NSLog(@"saving jpg %@",myFilePath); 
    UIImage *image = [[UIImage alloc] initWithData:imageData];//1.0f = 100% quality 

    BOOL isDir; 
    NSError *error; 
    if (!([[NSFileManager defaultManager] fileExistsAtPath:hotelsPath isDirectory:&isDir] && isDir)) { 
     if (![[NSFileManager defaultManager] createDirectoryAtPath:hotelsPath withIntermediateDirectories:true attributes:nil error:&error]){ 
      NSLog(@"%@",error); 
     } 
    } 

    NSData *dataImage = [NSData dataWithData:UIImageJPEGRepresentation(image, 1.0f)]; 
    if (![[NSFileManager defaultManager] createFileAtPath:myFilePath contents:dataImage attributes:nil]){ 
     NSLog(@"Not Saved!!!!"); 
    } 
    // [dataImage writeToFile:myFilePath atomically:YES]; 

    NSLog(@"saving image done"); 

    NSString *alertString = [NSString stringWithFormat: @"urlString: %@ || hotelsPath %@",urlString,hotelsPath]; 

    UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Alert" message:alertString delegate:self cancelButtonTitle:@"Close" otherButtonTitles:nil] autorelease]; 
    [alert show]; 

    [pool drain]; 
} 

的UIAlertView中只是在那裏,這樣我可以看到,在特設的身材,發生了什麼事。我已經把if語句儲蓄,以及在該地區的圖像(在那裏說:NSLog(@"Not Saved!!!!");)如果hotelsPath變量是不是一個已經存在的目錄捕獲錯誤(在那裏說:NSLog(@"%@",error);)之一。 UIAlertView沒有出現在這兩個區域。

再者,我直接從X-代碼構建到我的手機進行調試,但是當我臨時沒有存檔,並創建一個IPA文件直接放到我的電話這個代碼工作。我對iPhone開發非常陌生,並且不瞭解構建中的差異以瞭解它甚至可能是什麼。

編輯

下面是如果該文件存在的代碼檢查:

NSString *image_path = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 5)]; 
if ([image_path isEqualToString:@""]) { 
    hotel_image = [UIImage imageNamed:@"hdrHotels.jpg"]; 
}else{ 
    NSFileManager* fileManager = [NSFileManager defaultManager]; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); 
    NSString *libraryDirectory = [paths objectAtIndex:0]; 

    NSString *myFilePath = [libraryDirectory stringByAppendingPathComponent:image_path]; 

    BOOL fileExists = [fileManager fileExistsAtPath:myFilePath]; 

    if (fileExists){ 
     hotel_image = [UIImage imageNamed:image_path]; 
    }else{ 
     [NSThread detachNewThreadSelector:@selector(downloadImage:) toTarget:[HotelsDetailsViewController class] withObject:image_path]; 

     hotel_image = [UIImage imageNamed:@"hdrHotels.jpg"]; 
    } 
} 

我檢查,看看是否該數據庫具有圖像文件名,然後檢查圖像存在,並在不顯示默認圖像的情況下下載它。

更新

我添加了一些代碼來檢查文件路徑的文件大小。在保存文件之前,它是0Kb。保存文件後,我檢查的圖像是96,077Kb。這是在我的手機上。在工作正常的模擬器上,文件大小顯示相同的圖像爲97,696Kb。難道圖像只是不完全保存?或者iPhone上是否有壓縮類型?

文件路徑,例如

下面是這個應用程序將檢查的路徑:

/var/mobile/Applications/APP-NUMB3R-1D/Library/images/hotels/96.jpg

再次,在第一時間,酒店看了一下,它顯示了默認的圖像,因爲找不到此文件路徑。下一次,它顯示一個空白圖像,表明找到了文件路徑。另外,當我檢查文件路徑的內容大小時,第一次爲零。下一次,它是100Kb左右。所以肯定會寫些東西。最後,當我在調試模式下在我的實際手機上運行這個相同的代碼時,它可以工作並顯示圖像。當我使用專門構建運行它時,它不顯示圖像。

編輯

有可能是另一個問題。我剛剛發現,在更改我的代碼後,圖像不會在用我的iPhone下載調試版本後顯示出來。我必須在所有需要再次修復的測試中改變其他內容。之前在另一部手機上的調試版本仍在正常工作,所以至少我知道我並沒有失去理智。 ;)

我發現這是因爲我改變了我的文件路徑的變量名稱。改變了他們,並再次運作。

+0

請顯示您用於有條件檢查是否有圖像顯示的代碼。 – 2012-01-02 15:10:58

+0

Xcode只是一個集成編輯器 - 無關 – vikingosegundo 2012-01-02 15:15:38

+0

@AlexNichol我已經添加了代碼。 – James 2012-01-02 15:30:25

回答

1
  1. 你用ARC編程嗎?如果沒有,你應該釋放 「圖像」, 「爲imageData」 和 「警告」
  2. 我想你是誤會

    [UIImage的imageNamed:名字]的使用;

蘋果 UIIMage Docs

文件的名稱。如果這是第一次加載圖像,該方法會在應用程序的主包中查找具有指定名稱的圖像。

它在主束圖像的名字不在庫文件夾

如果你想從你的庫文件夾中加載一個文件,你應該使用:

[UIImage imageWithContentsOfFile:path]; 

您可以發佈一個帶有圖像完整路徑的NSLog?

+0

我真的不確定ARC是什麼意思,所以我不會猜測。但我不是這個應用程序的原創者。當我替換某人時,我就接管了它。我自己對iPhone的開發很新穎。我猜這是「自動釋放」的東西。不過,我會將文件路徑發佈爲頂端編輯並嘗試其他建議。 – James 2012-01-03 14:55:22

+0

ARC =自動引用計數。這是Xcode試圖控制你的留存,試圖從保留和釋放對象的開發者那裏承擔責任的新增加部分。如果您從頭開始創建項目,則默認使用ARC。如果它是使用以前版本的Xcode創建的,那麼它不使用ARC。 – ColdLogic 2012-01-03 15:10:11

+0

我將imageNamed更改爲imageWithContentsOfFile,但沒有奏效。它實際上停止在模擬器上顯示圖像,並以調試模式在手機上運行應用程序。 – James 2012-01-03 15:14:21

0

我仍然認爲這個問題可能是一個權限問題。這將意味着您的代碼有條件地檢查圖像時出現了問題。我從經驗中看到,您可以安全地保存到iOS上的唯一目錄是文檔目錄。您可以使用UIImageWriteToSavedPhotosAlbum函數將照片保存到用戶照片庫,但無法通過直接文件I/O執行此操作。

+0

好吧,我的印象是它的文檔,程序庫和緩存。我正在嘗試使用該庫。我會發布我的代碼。 – James 2012-01-02 15:26:47

+0

在我的文章底部添加了一些信息。這絕對是創建一個文件,但它似乎不是完整的文件大小。 – James 2012-01-03 14:10:31

0

我相信這可能是更加硬朗要經過你的代碼......此外,在第一次看你好像正在執行的主線程...這是不可取的網絡活動...

但一個我可以給你的最好的例子是按照下面的鏈接。你會得到精確解下載圖像在您的應用程序,並且還包含代碼來解壓壓縮文件,或者你可以做任何你想要的,這樣做......

按照鏈接:

http://www.raywenderlich.com/4295/multithreading-and-grand-central-dispatch-on-ios-for-beginners-tutorial

njoy編碼...

+0

我實際上使用detachNewThreadSelector來啓動圖像下載功能,以便它在後臺運行。但我會檢查你的鏈接。謝謝回覆。 – James 2012-01-02 20:14:18

相關問題