前陣子在 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 吧!


changyy 發表在 痞客邦 PIXNET 留言(0) 人氣()