我知道这个功能首先返回"图像"那么" findObjectsInBackgroundWithBlock"检索数据为什么结果为零。
1 - 如何从块返回数组?
2 - 如何将此块放在主线程中?
+(NSMutableArray *)fetchAllImages{
__block NSMutableArray *images = [NSMutableArray array];
PFQuery *query = [PFQuery queryWithClassName:@"Photo"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error) {
for (PFObject *object in objects) {
PFFile *applicantResume = object[@"imageFile"];
NSData *imageData = [applicantResume getData];
NSString *imageName = [ImageFetcher saveImageLocalyWithData:imageData FileName:object.objectId AndExtention:@"png"];
[images addObject:imageName];
// here images is not empty
}
} else {
NSLog(@"Error: %@ %@", error, [error userInfo]);
}
}];
// here images is empty
return images;
}
答案 0 :(得分:1)
该方法异步执行其工作,调用者需要知道这一点。所以,
不要:
+(NSMutableArray *)fetchAllImages{
返回一个数组,因为该数组在返回时尚未就绪。
执行:
+ (void)fetchAllImages {
什么都不返回,因为这是方法完成执行时的结果。
但是如何将图像提供给来电者?与findObjectsInBackgroundWithBlock
相同的方式,使用稍后运行的代码块....
执行:
+ (void)fetchAllImagesWithBlock:(void (^)(NSArray *, NSError *)block {
然后,使用findBlock中的代码:
[images addObject:imageName];
// here images is not empty
// good, so give the images to our caller
block(images, nil);
// and from your code, if there's an error, let the caller know that too
NSLog(@"Error: %@ %@", error, [error userInfo]);
block(nil, error);
现在你的内部调用者调用此方法就像你的fetch代码调用parse:
一样[MyClassThatFetches fetchAllImagesWithBlock:^(NSArray *images, NSError *error) {
// you can update your UI here
}];
关于主线程的问题:您希望网络请求在主要线程上运行,而且确实如此。您希望在完成后运行的代码在main上运行,因此您可以安全地更新UI。
答案 1 :(得分:0)
它不起作用。
您正在调用异步方法。您不能等待异步方法的结果并返回结果(好吧,您可以,但如果您要求如何在stackoverflow上执行此操作则不行)。使用异步块,您可以触发操作,并且由完成块决定是否在需要时提供结果。
有很多例子如何在stackoverflow上执行此操作。寻找他们是你的工作。