2012-09-07 37 views
1

我目前正在做這從JSON文件填充核心數據時:AFNetworking替代sendSynchronousRequest用於填充CoreData

NSString *urlString = [value objectForKey:@"url"]; 
NSURL *url = [NSURL URLWithString:urlString]; 
NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
NSURLResponse *response = nil; 
NSError *error = nil; 
NSData *dataResponse = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
[managedObject setValue:dataResponse forKey:@"image"]; 

有沒有更好的(異步)方式與AFNetworking做到這一點?這種情況最好的方法是什麼?它是否必須是同步的,因爲我們正在處理CoreData?

UPDATE:現在嘗試此:

NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 

[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) 
       { 
        [managedObject setValue:data forKey:@"image"]; 
       }]; 

因爲當我以後要進入管理對象某種原因,圖像屬性總是空,即使上述*的數據是不是在完成處理程序無效。在同步方法中,圖像可以很好地保存。我錯過了什麼?

+2

在方法名稱的'synchronous'部分的前面添加'a'字母... – 2012-09-07 17:43:27

+0

@ H2CO3簡潔而好的評論+1 –

+0

我認爲您需要在上下文中執行「保存」。但要注意線程。像你一樣從不同線程訪問「NSManagedObject」和「NSManagedObjectContext」是容易出錯的。爲了避免這種情況而不是傳遞一個新的隊列,使用'NSOperationQueue mainQueue'作爲'NSURLConnection'。 –

回答

0

NSURLConnection也可以處理異步。如果需要定位到iOS < 5然後使用委託模式爲NSURLConnection

,可以使用該方法(的iOS> = 5)是

+ sendAsynchronousRequest:queue:completionHandler: 

。一個很好的包裝可以在NSURLConnection and grand central dispatch中找到。

關於核心數據,我會說這取決於。如果您需要存儲的數據很便宜,請在主線程中執行。相反,你有三種不同的方法來做到這一點:

  • (1)使用新的核心數據基於隊列的API(iOS版> = 5)
  • (2)揭開序幕NSOperationQueueNSOperation做在後臺長時間工作
  • (3)使用GDC

注重核心數據的限制(線程約束)當你處理(2)或(3)。

希望有所幫助。

P.S.如果你想知道其他的東西讓我知道。

+0

請查看我的問題的更新。 – soleil

0

有一個sendAsynchronousRequest:queue:completionHandler:消息NSURLConnection