Obj-C类方法来自块

时间:2015-02-08 17:58:08

标签: objective-c multithreading objective-c-blocks

我知道这个功能首先返回"图像"那么" 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;
    }

2 个答案:

答案 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上执行此操作。寻找他们是你的工作。