dispatch_sync vs. dispatch_async kulayini oyinhloko

Ngibekezelele, lokhu kuzothatha incazelo ethile. Nginomsebenzi obukeka njengalona ongezansi.

Okuqukethwe: "aProject" yibhizinisi leCore Data elibizwa nge-LPProject elinamalungu afanayo aqanjwe ngokuthi 'ilunguFiles' eliqukethe izimo zelinye ibhizinisi leCore Data elibizwa nge-LPFile. I-LPFile ngayinye imele ifayela kudiski futhi esifuna ukukwenza ukuvula ngalinye lalawo mafayela bese sihlaziya umbhalo wawo, sifuna izitatimende ze- @import ezikhomba amanye amafayela. Uma sithola izitatimende ze- @import, sifuna ukuthola ifayela abalikhombayo bese 'sixhuma' lelo fayela kulena ngokungeza ubudlelwane ebhizinisini ledatha eliyinhloko elimele ifayela lokuqala. Njengoba konke lokho kungathatha isikhathi kumafayela amakhulu, sizokukwenza kususwe ocingweni olukhulu sisebenzisa i-GCD.

- (void) establishImportLinksForFilesInProject:(LPProject *)aProject {
    dispatch_queue_t taskQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
     for (LPFile *fileToCheck in aProject.memberFiles) {
         if (//Some condition is met) {
            dispatch_async(taskQ, ^{
                // Here, we do the scanning for @import statements. 
                // When we find a valid one, we put the whole path to the imported file into an array called 'verifiedImports'. 

                // go back to the main thread and update the model (Core Data is not thread-safe.)
                dispatch_sync(dispatch_get_main_queue(), ^{

                    NSLog(@"Got to main thread.");

                    for (NSString *import in verifiedImports) {  
                            // Add the relationship to Core Data LPFile entity.
                    }
                });//end block
            });//end block
        }
    }
}

Manje, nazi izinto ezixakayo:

Le khodi iyasebenza, kepha ngibona inkinga eyinqaba . Uma ngiyisebenzisa ku-LPProject enamafayela ambalwa (cishe angama-20), isebenza kahle. Kodwa-ke, uma ngiyisebenzisa ku-LPProject enamafayela amaningi (yithi, 60-70), ayenzi HHAYI isebenze kahle. Asisabuyeli entanjeni enkulu, i- NSLog (@ "yafika ochungechungeni olukhulu"); ayikaze ivele futhi uhlelo lokusebenza lilenga. KODWA, (futhi kulapho izinto ziba isimanga NGEMPELA) --- uma ngisebenzisa ikhodi kuphrojekthi encane KUQALA bese NGIYIHAMBISA kuphrojekthi enkulu, konke kusebenza kahle. KUPHELA lapho ngiqalisa ikhodi kuphrojekthi enkulu kuqala lapho kuvela khona inkinga.

Futhi nangu umkhabi, uma ngiguqula ulayini wesibili wokuthumela kulokhu:

dispatch_async(dispatch_get_main_queue(), ^{

(Okusho ukuthi, sebenzisa async esikhundleni se- sync to dispatch the block to main main), konke kusebenza ngaso sonke isikhathi. Ngokuphelele. Akunandaba nenani lamafayela kuphrojekthi!

Ngilahlekelwe ukuchaza le ndlela yokuziphatha. Noma yiluphi usizo noma amathiphu wokuthi yini okufanele uvivinye ngokulandelayo angabongwa.

52
задан Jano 4 October 2013 в 11:53
поделиться