2017-08-05 18 views
11

Geri Bildirim Verme Çoklu işlev çağrısı hata yayılmasında bir sorunla karşı karşıya. Bunu yaparken çökmesineNSError ** sorunu çok işlevli çağrıda yayılıyor

- (void)deserializePlan:(NSArray*)planElements forPlan:(LMSPlanFolder*)planFolder allowingNoEndDate:(BOOL)allowNoEndDate withError:(NSError *__autoreleasing*)err { 
    .... 
    .... 
    if(err) { 
     *err = [NSError errorWithDomain:@"Application" code:-1 userInfo:@{ NSLocalizedDescriptionKey:[NSString stringWithFormat:@"Plan was not found."]}]; 
    } 
    return; 
    } 

Sorun, bu yol açar:

- (EMSPlanFolder*)buildPlanFromParsePlan:(EMParsedPlan*)parsedPlan withError:(NSError *__autoreleasing*)err 
{ 
.... 
.... 
[self deserializePlan:parsedPlan forPlan:newPlanFolder allowingNoEndDate:NO withError:err]; 
    if(err && *err) { 
    [newPlanFolder.managedObjectContext performBlockAndWait:^{ 
[EMSPlanFolder deletePlan:newPlanFolder]; 
    }]; 
    return nil; 
    } 
return newPlanFolder; 
} 

Sonraki, bu gider: Örneğin

,

NSError *error = nil; 
EMSPlanFolder *planner = [[EMSPlanFolder sharedPlanBuilder] buildPlanFromParsePlan:plan withError:&error]; 
if (error) { 
    //error 
} 

Sonraki, bu işlev gider geri ilk kod snippet'ine yayılır. Bunun

+2

Kaza açıklaması ve yığın izini gösterebilir misiniz? –

+0

Yukarıdaki işlevin üstesinden geldiğinizde kilitlenme detayı ekleyebilir misiniz? \ – CodeChanger

+0

Üzgünüz, herhangi bir kilitlenme günlüğü kaydedilmediyse, "msg" exc_bad_access code = exc_i386_gpflt " – iNeo

cevap

0

üzerinde herhangi bir öneriniz bu deneyin:

NSError *error = nil; 
EMSPlanFolder *planner = [[EMSPlanFolder sharedPlanBuilder] buildPlanFromParsePlan:plan withError:&error]; 
if (error) { 
    //error 
} 

- (EMSPlanFolder*)buildPlanFromParsePlan:(EMParsedPlan*)parsedPlan withError:(NSError **)err 
{ 
.... 
.... 
[self deserializePlan:parsedPlan forPlan:newPlanFolder allowingNoEndDate:NO withError:&err]; 
    if(err == nil) { 
    [newPlanFolder.managedObjectContext performBlockAndWait:^{ 
[EMSPlanFolder deletePlan:newPlanFolder]; 
    }]; 
    return nil; 
    } 
return newPlanFolder; 
} 

- (void)deserializePlan:(NSArray*)planElements forPlan:(LMSPlanFolder*)planFolder allowingNoEndDate:(BOOL)allowNoEndDate withError:(NSError **)err { 
    .... 
    .... 
    if(err) { 
     *err = [NSError errorWithDomain:@"Application" code:-1 userInfo:@{ NSLocalizedDescriptionKey:[NSString stringWithFormat:@"Plan was not found."]}]; 
    } 
    return; 
} 
0

Elma çerçeveler genellikle iç içe sallanmasını havuzlarında bloklarının uygulanması. Hata referansınız otomatik olarak başlatılıyor ve bu yüzden blok yürütmeyi bitirdiğinde hata ortaya çıkıyor. Bunu önlemek için hatayı korumak için güçlü bir yerel __block değişken kullanın. Şunun gibi bir şey deneyin:

__block NSError *theError = nil; 

[context performBlockAndWait:^{ 
    // 
    [self deserializePlan:parsedPlan 
        forPlan:newPlanFolder 
     allowingNoEndDate:NO 
       withError:&theError]; // <- store the error ARP safe 
}]; 
*err = theError; 
İlgili konular