2010年6月28日 星期一

UIImageWriteToSavedPhotosAlbum Domain=ALAssetsLibraryErrorDomain Code=-3301 "寫入忙碌中"

前陣子在 iPhone 模擬器上寫之儲存照片的小程式,使用連續儲存的方式,發現可以很順利,但是移到實體機子上頭,卻發現儲存的照片張數不對,假設有 10 張照片要儲存,但真正存進去的只有 5 張不到,而且現象是有時張數多有時張數少,但一定沒有達到 10 張。


後來透過 error report 並在實體機上跑時才看到錯誤訊息:


Error Domain=ALAssetsLibraryErrorDomain Code=-3301 "寫入忙碌中" UserInfo=0xXXXXXX {NSLocalizedFailureReason=, NSLocalizedRecoverySuggestion=再試著寫入一次, NSLocalizedDescription=寫入忙碌中}


偶爾也還有看到 sqlite3 等訊息(但它有容錯處理)


sqlite error 5 [database is locked]
sqlite prepare statement retry was successful.  Continuing.


而真正的問題還是儲存照片問題,最後則是想到用 sleep 的方式解決,也就是避開短時間儲存,改成每存完一張 sleep 1.5 秒


- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error
contextInfo:(void *)contextInfo
{
        if( error != nil )
               
NSLog( @"SaveError(%f,%f) Message:%@", image.size.width,
image.size.height, error);
}

- (void)saveToPhotoLibrary
{
    for( id raw_data in [images allValues] )
    {
        UIImage *image = [[UIImage alloc] initWithData:raw_data];
        UIImageWriteToSavedPhotosAlbum( image, self, @selector(image:didFin    ishSavingWithError:contextInfo:), nil );
        [image release];
        [NSThread sleepForTimeInterval:1.5];
    }
}


修正後,還是偶爾會出現其他的訊息,並且隨著 Photos Library 內的圖片增加,導致訊息顯示會越來越頻繁甚至不正常當掉(當掉可能比較跟記憶體控制有關)


slow transaction: time was 0.xxxxxx seconds
Received memory warning. Level=1
Received memory warning. Level=2


暫時還沒想到恰當的解法(可以考慮依 Photos Library 的照片張數調整 sleep 秒數),未來設計上可能還是要避開把資料塞進 Photos Library 吧!


沒有留言:

張貼留言