2015-02-08 42 views
0

我知道這個函數首先返回「圖像」,然後「findObjectsInBackgroundWithBlock」檢索數據,這就是爲什麼結果爲零。Obj-C類的方法結果從塊

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

它不起作用。

您正在調用異步方法。你不能等待一個異步方法的結果並返回結果(當然,如果你問的是如何在stackoverflow上進行操作的話,也可以,但不行)。使用異步塊,您可以觸發一個操作,並且完成功能塊將在需要時提供結果。

有一些示例如何在stackoverflow上做到這一點。尋找他們是你的工作。

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); 

現在您的內部呼叫者調用此方法就像您的提取代碼調用解析:

[MyClassThatFetches fetchAllImagesWithBlock:^(NSArray *images, NSError *error) { 
    // you can update your UI here 
}]; 

Regar回答關於主線程的問題:你想讓網絡請求跑掉主線程,並且確實如此。您希望在完成後運行的代碼在main上運行,以便您可以安全地更新UI。

+0

謝謝你:) – 2015-02-08 19:18:29