2016-03-25 118 views
5

我想讀取指定文件(來自相機膠捲的照片)異步,但它不適用於我。無法讀取異步PHAsset內容

變量tempData得到nil直到我改變配置requestOptionForPhotos.synchronousYES,那麼一切都很好,但我不想執行此代碼同步。

是否有可能通過請求訪問其他線程中的同一文件來阻止訪問照片?我是Objective-C和iOS編程的新手,我不知道它是如何工作的。

NSURL *assetUrl = [[NSURL alloc] initWithString:filepath]; 
    PHFetchResult *collection = [PHAsset fetchAssetsWithALAssetURLs:[NSArray arrayWithObject:assetUrl] options:nil]; 

    PHImageRequestOptions *requestOptionForPhotos = [[PHImageRequestOptions alloc] init]; 
    requestOptionForPhotos.networkAccessAllowed = YES; 
    requestOptionForPhotos.synchronous = NO; 

    __block BOOL isFinished = NO; 
    __block NSData * tempData = nil; 

    for(PHAsset *asset in collection) { 
    [[PHImageManager defaultManager] 
    requestImageForAsset:asset 
    targetSize:CGSizeMake(80, 80) 
    contentMode:PHImageContentModeAspectFill 
    options:requestOptionForPhotos 
    resultHandler:^(UIImage *result, NSDictionary *info) { 
     tempData = UIImagePNGRepresentation(result); 
     isFinished = YES; 
    }]; 
    } 
+0

你會得到有效的文件路徑嗎?還有,您收集「收集」對象中是否有任何數據? –

+0

是的,有一些數據和路徑也是有效的。 – siwymilek

回答

0
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); 
    dispatch_async(queue, ^{ 
     NSURL *assetUrl = [[NSURL alloc] initWithString:filepath]; 
     PHFetchResult *collection = [PHAsset fetchAssetsWithALAssetURLs:[NSArray arrayWithObject:assetUrl] options:nil]; 
     PHImageRequestOptions *requestOptionForPhotos = [[PHImageRequestOptions alloc] init]; 
     requestOptionForPhotos.networkAccessAllowed = YES; 
     requestOptionForPhotos.synchronous = NO; 

     __block BOOL isFinished = NO; 
     __block NSData * tempData = nil; 

     for (PHAsset *asset in collection) { 
      [[PHImageManager defaultManager] 
         requestImageForAsset:asset 
         targetSize:CGSizeMake(80, 80) 
         contentMode:PHImageContentModeAspectFill 
         options:requestOptionForPhotos 
         resultHandler:^(UIImage *result, NSDictionary *info) { 
          tempData = UIImagePNGRepresentation(result); 
          isFinished = YES; 
      }]; 
     } 
    }); 

試試這個代碼來獲取asynchronusly圖像,並把斷點結果handdler檢查天氣,你越來越像與否。