我有一个可以广泛使用照片的应用程序,可以对它们进行一些操作:
我编写的大多数方法都可以在AlAssets上运行,因此我想编写测试(我正在使用新的XCTest框架)以在ALAssets上运行。
我在项目中包括了一组照片,用作测试的输入,我计划在[XCTest + setUp]上将每个图像添加到库中,并在[XCTest + tearDown]上将它们删除。
一切都进行得很顺利-有时,进行XCTest编译是一场噩梦-但是对于我进行的每次调用:
- (void)writeImageDataToSavedPhotosAlbum:metadata:completionBlock:
永远不会调用完成块,并且不会将任何图像添加到库中,如果稍后再枚举其中的所有照片,我只会看到库中先前可用的照片。
为了确保完成块能够运行,我使用信号量控制应用程序流,如下所示:
UIImage *image = [self imageWithName:@"DSC_0002" extension:@"JPG"];
NSData *dataJpeg = UIImageJPEGRepresentation(image, 0.9f);
ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init];
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
[library writeImageDataToSavedPhotosAlbum:dataJpeg metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {
// control will never run this code
NSLog(@"Asset URL %@",[assetURL absoluteString]);
dispatch_semaphore_signal(sem);
}];
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
有任何想法吗 ?是否有可能无法在XCTest上的库中编写?
提前致谢,
泽
最佳答案
您可以通过触发运行循环直到满足条件来阻止测试方法在块执行之前退出。这是一个例子:
- (void)testAssetLibraryOperation
{
NSURL *assetURL; // get this however you want
ALAssetsLibrary *lib = [ALAssetsLibrary new];
__block BOOL waiting = YES;
[lib assetForURL:assetURL resultBlock:^(ALAsset *asset) {
// perform tests on asset
XCTAssertNotNil(asset, @"asset should not be nil");
// stop waiting
waiting = NO;
} failureBlock:nil];
// wait until BOOL says NO
while (waiting) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
}
}
如果操作时间太长,您可能想添加逻辑以停止等待。
您也可以在GitHub上查看这些资源,以获取更多信息和启发
关于ios - 使用XCTest将图像添加到ALAssetsLibrary,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22540436/