2012-08-08 63 views
0

您好我想使用隊列和塊到多線程,但我有麻煩訪問這些塊的屬性。當我使用NSLog打印self.photoArray的值時,我得到空值。有人能解釋我做錯了什麼嗎?我曾嘗試過這種方式從塊訪問屬性,目標C

dispatch_queue_t downloadQueue = dispatch_queue_create("flickrDownload", NULL); 

    dispatch_async(downloadQueue, ^{         

     NSArray* photos = [FlickrPhotoSort sortTopPlaces]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 

      self.photoArray = photos; }); 


    }); 

    dispatch_release(downloadQueue); 

和這不使用主隊列。

dispatch_queue_t downloadQueue = dispatch_queue_create("flickrDownload", NULL); 

dispatch_async(downloadQueue, ^{         

    NSArray* photos = [FlickrPhotoSort sortTopPlaces]; 

     self.photoArray = photos; 

}); 

dispatch_release(downloadQueue); 

這裏是我下面的在線斯坦福大學課程photoArray

的二傳手
-(void) setPhotoArray:(NSArray *)photoArray{ 
    if(!_photoArray) _photoArray = [[NSArray alloc] initWithArray:photoArray]; 
else 
    _photoArray = photoArray; 

} 

,老師乾脆叫物業喜歡這一點,似乎工作

dispatch_queue_t downloadQueue = dispatch_queue_create("flickr downloader", NULL); 
    dispatch_async(downloadQueue, ^{ 
     NSArray *photos = [FlickrFetcher recentGeoreferencedPhotos]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      self.navigationItem.rightBarButtonItem = sender; 
      self.photos = photos; 
     }); 
    }); 
    dispatch_release(downloadQueue); 
+0

在哪裏日誌語句?你在做什麼之前在做什麼?你在使用ARC嗎? – 2012-08-08 22:25:48

+0

我不知道什麼是ARC,但我在tableViewController,我把這個代碼在viewDidLoad方法,我稱之爲日誌語句在TableViewController – 2012-08-08 22:28:00

回答

-2

使用關鍵字__block用於塊中的iVar。這可以確保,財產留在記憶中。如果使用ARC和前5.0使用__unsafe_unretained其他__weak

__block NSArray *bPhotoArray = self.bPhotoArray; 
dispatch_async(downloadQueue, ^{         

    NSArray* photos = [FlickrPhotoSort sortTopPlaces]; 
     bPhotoArray = photos; 
}); 
+0

爲什麼不能我只是叫我的財產的cellForRowAtIndexPath方法? – 2012-08-08 22:08:39

+0

我試過了,它不起作用我不斷收到 – 2012-08-08 22:12:20

+0

塊被複制到內存中。想象一下,當你下載圖像時,自我會得到處理。比你自己調用的塊代碼。這導致崩潰。爲此,一個街區保留自我。在塊中調用自身會導致循環保留 - >泄漏。 – zeiteisen 2012-08-08 22:16:44

-1

由於性能調用一個方法調用我有沒有問題,一個塊中設置它們。 __block只能將變量的可見性添加到塊範圍之外的變量 - 以便在塊範圍之外查看塊內變量的變化。它只有在直接在塊使用VARS上性能沒有影響(其中,它們是實例變量或沒有。)性能不高德它們是明確的方法調用到設置塊的範圍之外的實例變量的類。

應該將照片數組保留在setter中 - 但是數組將在塊的結尾處被釋放,否則將被釋放。我有大量代碼設置屬性從塊內沒有問題。

+0

我該如何保留照片數組在設置? – 2012-08-08 22:18:52

+0

else _photoArray = [photoArray retain]; } – 2012-08-08 22:39:25

1

當我使用NSLog打印self.photoArray的值時,我得到空值。

異步運行[FlickrPhotoSort sortTopPlaces]可能仍然在運行,當你敲擊log語句並且該屬性還沒有被設置時。

+0

問題是我然後使用PhotoArray來填充我的TableViewController,但由於self.photoArray爲null,單元格沒有正確填充。我認爲控制器將不得不等待,直到它擁有它所需的一切? – 2012-08-08 22:39:37

+0

沒有Nik是正確的,當它完成時,你需要從你的塊中調用回填充你的tableview。 – 2012-08-08 22:41:38

+0

@TerrelGibson當然,它必須等待數據填充表視圖。當數據進入時,只需調用'reloadData'。 – 2012-08-08 22:41:41