2016-04-04 20 views
0
benim kod API gelen dizi indirmek için çalışır

, rastgele bu hata iletisiyle kilitleniyor:Çekirdek Veri kazasında girişimi

(entity: Series; id: 0x7b181002016-04-04 14:01:33.868 Postzegel Catalogus[1816:39059] CoreData: error: Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. -[NSCFSet addObject:]: attempt to insert nil with userInfo (null) 0 (entity: Series; id: 0x7b00c450 ; 2016-04-04 14:01:33.871 Postzegel Catalogus[1816:39059] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFSet addObject:]: attempt to insert nil' *** First throw call stack: ( 0 CoreFoundation 0x0083d494 __exceptionPreprocess + 180 1 libobjc.A.dylib
0x02551e02 objc_exception_throw + 50 2 CoreFoundation
0x0083d3bd +[NSException raise:format:] + 141 3 CoreFoundation
0x0070c959 -[__NSCFSet addObject:] + 185 4 CoreData
0x0038a010 -[NSManagedObjectContext(_NSInternalChangeProcessing) _processPendingInsertions:withDeletions:withUpdates:] + 560 5 CoreData 0x003846da -[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] + 2410 6 CoreData 0x00383d56 -[NSManagedObjectContext processPendingChanges] + 54 7
CoreData 0x003ae5e4 -[NSManagedObjectContext(_NestedContextSupport) _parentProcessSaveRequest:inContext:error:] + 116 8 CoreData 0x00433bec __82-[NSManagedObjectContext(_NestedContextSupport) executeRequest:withContext:error:]_block_invoke + 412 9 CoreData
0x003a924c internalBlockToNSManagedObjectContextPerform + 76 10 libdispatch.dylib 0x03c8f9cd _dispatch_client_callout + 14 11 libdispatch.dylib 0x03c76d90 _dispatch_barrier_sync_f_slow_invoke + 133 12 libdispatch.dylib 0x03c8f9cd _dispatch_client_callout + 14 13 libdispatch.dylib 0x03c74f7c _dispatch_main_queue_callback_4CF + 910 14 CoreFoundation 0x007871be __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE
+ 14 15 CoreFoundation 0x00745434 __CFRunLoopRun + 2356 16 CoreFoundation 0x00744846 CFRunLoopRunSpecific + 470 17 CoreFoundation
0x0074465b CFRunLoopRunInMode + 123 18 GraphicsServices
0x07a8d664 GSEventRunModal + 192 19 GraphicsServices
0x07a8d4a1 GSEventRun + 104 20 UIKit
0x0102beb9 UIApplicationMain + 160 21 Postzegel Catalogus
0x000f63b1 main + 145 22 libdyld.dylib
0x03cb9a25 start + 1) (entity: Series; id: 0x7b25bc40 ;

Ve ben sadece neden bilmiyorum ? Kullanarak özel bir Yönetilen İçerik Seçeneği kullanıyorum. Hatta .xcdatamodeld alanlarını isteğe bağlı olarak ayarlıyorum. Yani bir sorun olmamalı, o nil değil mi? Ve aynı nesnede bile rastgele çöküyor. Bunu nasıl düzeltebilirim?

Kodumu, size yardımcı olabilecek umuma ekledim. API anahtarımı kaldırdım, bu yüzden denemeyebileceksiniz. Kodumla ilgili başka bir yorumunuz varsa lütfen bana bildirin, Çekirdek Veriler ve Alamofire için yeniyim, bu yüzden 'spagetti kodu' yapmak için kiracım var. peşin

Teşekkür

import Foundation 
import CoreData 
import Alamofire 
import SwiftyJSON 

//CoreData Init 
let appDelegate: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
let managedContext: NSManagedObjectContext = appDelegate.managedObjectContext 

let queue = dispatch_queue_create("com.GJ-Computers.Postzegel-Catalogus.responseJSON-Manager", DISPATCH_QUEUE_CONCURRENT) 

//Colnect API 
let LANG: String = NSLocale.preferredLanguages()[0].substringToIndex(NSLocale.preferredLanguages()[0].startIndex.advancedBy(2)) 
let DATE = NSCalendar.currentCalendar().component([.Day, .Month, .Year], fromDate: NSDate()) 
let API_KEY: String = "----" //Private API KEY 
let CAT_STAMPS: String = ("cat/stamps/") 
var BASE_URL: String{ 
    return ("http://api.colnect.net/" + LANG + "/api/" + API_KEY + "/") 
} 

//Ghetto Delegate 
var didGetCountires: Bool = false 
var didGetYears: Bool = false 
var didGetSeries: Bool = false 

//MARK: - First Time setup Database 
func setupDatabase(){ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)){ 


     getYears() //Download Years per country from database   
} 
    } 


//get Series 
func getSeries(){ 
    //Retrieve Countries from Coredata 
    let countryFetchRequest = NSFetchRequest(entityName: "Countries") 
    var results: [Countries]? 
    do { 
     results = try managedContext.executeFetchRequest(countryFetchRequest) as? [Countries] 
    } catch let error as NSError { 
     print("Could not fetch \(error), \(error.userInfo)") 
    } 

    let resultCount = results!.count 
    var completedRequestCount: Int = 0 
    var requestedRequests = 0 


    for result in results!{ 
     let countryID = result.countryID 
     Alamofire.request(.GET, (BASE_URL + "series/"+CAT_STAMPS+"producer/\(countryID)")).responseJSON(queue: queue, completionHandler:{ response in 
      if let json = response.result.value{ 
       let privateMOC = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType) 
       privateMOC.parentContext = managedContext 

       let rawData = JSON(json) 
       for data in rawData { 
        //Setup let 
        let seriesID = Int(data.1.array![0].string!) 
        let seriesName = data.1.array![1].string 
        let itemCount = Int(data.1.array![2].string!) 

        if seriesID != 0 && itemCount != 0 && seriesName != nil{ 
         privateMOC.performBlock{ 
          let series = NSEntityDescription.insertNewObjectForEntityForName("Series", inManagedObjectContext: managedContext) as! Series 
          series.countryID = countryID 
          series.seriesID = seriesID 
          series.seriesName = seriesName 
          series.itemCount = itemCount 

          print(completedRequestCount) 

          do { 
           try privateMOC.save() 
          } catch let error as NSError { 
           print("Could not save \(error), \(error.userInfo)") 
          } 
         } 

        }else{ 
         print("ERROR") 
        } 

       } 
      } 
      completedRequestCount += 1 
      print(completedRequestCount) 
     }) 
     requestedRequests += 1 
     if(requestedRequests == resultCount){ 
      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)){ 
       while(true){ 
        if(completedRequestCount == resultCount){ 
         didGetSeries = true 
         sleep(3) 
         print("DEBUG - Series Done") 
         break 
        } 
       } 
      } 
     } 
    } 
} 
+0

olmalıdır. Başlığa göre, NSSet'e bir nesneyi nereye eklediğinizi tahmin ediyorum --- - [__ NSCFSet addObject:]: nil ekleme girişiminde bulunun - Bir gruba nil nesnesi ekleyemezsiniz, böylece her yerde öğeye bir öğe, sıfır olup olmadığını kontrol edin. Öyleyse, orada bir kırılma noktası koyun ve bu size yanlış gittiğiniz yeri gösterecektir. – CW0007007

+0

Tamam, bazı kodları kaldıracağım. Eklediğim nesne, yerleştirmeden önce konsola yazdırılır. Bunun nil değerleri olmadığını görebiliyorum, bu yüzden bunun nedeni olamaz ki? – sloeberGJ

+1

nil olan bir ilişki - belki bir iş parçacığı hatası !? –

cevap

1

kendim çözüldü. Özel bir MOC yaptım, ancak bir tane oluşturduğunuzda sürekli olarak kodu eklemelisiniz, aksi takdirde işe yaramaz. ManagedMontext'i privateMOC ile değiştirmeyi unuttum. Benim kötü

let series = NSEntityDescription.insertNewObjectForEntityForName("Series", inManagedObjectContext: managedContext) as! Series 

Sen tüm kod, sadece alakalı kısımları yapıştırmak gerekmez

let series = NSEntityDescription.insertNewObjectForEntityForName("Series", inManagedObjectContext: privateMOC) as! Series 
İlgili konular