سؤال

لقد بدأت للتو في استخدام AFNetworking وحتى الآن كان الأمر جيدًا للحصول على البيانات من الويب.

ولكن لدي الآن قائمة بالملفات التي يجب تنزيلها على الجهاز

for(NSDictionary *issueDic in data)
{
    Issue *issue = [[Issue alloc] init];
    ...
    [self getOrDownloadCover:issue];
    ...
}

getOrDownloadCover: المشكلة تتحقق مما إذا كان الملف موجودًا بالفعل محليًا، وإذا كان موجودًا، فإنه يحفظ هذا المسار فقط، وإذا لم يكن موجودًا، فإنه يقوم بتنزيل الملف من عنوان URL محدد

- (void)getOrDownloadCover:(Issue *)issue
{
    NSLog(@"issue.thumb: %@", issue.thumb);

    NSString *coverName = [issue.thumb lastPathComponent];

    NSLog(@"coverName: %@", coverName);

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    __block NSString *filePath = [documentsDirectory stringByAppendingPathComponent:coverName];

    if([[NSFileManager defaultManager] fileExistsAtPath:filePath])
    {
        // Cover already exists
        issue.thumb_location = filePath;

        NSLog(@"issue.thumb_location: %@", filePath);
    }
    else 
    {
        NSLog(@"load thumb");

        // Download the cover
        NSURL *url = [NSURL URLWithString:issue.thumb];
        AFHTTPClient *httpClient = [[[AFHTTPClient alloc] initWithBaseURL:url] autorelease];
        NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET" path:issue.thumb parameters:nil];

        AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:request] autorelease];
        operation.outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:NO];

        [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        issue.thumb_location = filePath;

        NSLog(@"issue.thumb_location: %@", filePath);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"FAILED");
    }];
        [operation start];
    }
}

getOrDownloadCover: يمكن استدعاء المشكلة 20 مرة متتالية، لذلك سأحتاج إلى وضع جميع طلباتي في قائمة انتظار، وبمجرد اكتمال قائمة الانتظار، من المفترض أن تظل قادرة على حفظ المسار (أو مجرد إرسال إشعار، نظرًا لأن أنا أعرف بالفعل ما هو المسار)

أي اقتراحات لهذا؟

هل كانت مفيدة؟

المحلول

إضافة NSOperationQueue إلى كائن يمكنك الحصول على مثيل له في أي وقت في تطبيقك، على سبيل المثال في appDelegate.ثم أضف فقط AFHTTPRequestOperation إلى قائمة الانتظار هذه مثل:

[[(AppDelegate *) [UIApplication sharedApplication].delegate operartionQueue] addOperation:operation];

ما عليك سوى التعامل مع الحفظ في كتلة الإكمال، إما باستدعاء طريقة من هذه الكتلة على الموضوع الرئيسي أو نشر ملف NSNotification.

للاتصال بالسلسلة الرئيسية استخدم GCD :

dispatch_async(dispatch_get_main_queue(), ^{
    // Call any method from on the instance that created the operation here.
    [self updateGUI]; // example
});

نصائح أخرى

غير متأكد إذا كان هذا مفيدا ولكن ...

بدلا من استخدام تشغيلها الخاص، يمكنك استخدام تشغيل AFHTTPClient.Enqueue عمليات واحدة مع Enqueuehttpoperation أو Enquue مجموعة من العمليات مع enqueueBatchperations (أذكر أسماء هذه الأسماء من الذاكرة، من المحتمل قبالة قليلا).

بقدر تخزين البيانات الخاصة بكل عملية، يمكنك تصنيف الفئة الفرعية AFHTPRECTOPERONESTOPERONESTOPERATITITITIOPERATITITITITIOPERAشيء من هذا القبيل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top