2014-02-06 50 views
2

我已經發布了問題How to use Bolts Framework[Facebook+Parse],但現在我有問題了,如果我想使用Bolts框架,我必須使用解析webservice嗎?Bolts框架[Parse + Facebook]需要使用解析webservice嗎?

他們提供瞭如下示例代碼,它將(saveAsync:)關聯到解析webservice。但我已經看到了這條線"Using these libraries does not require using any Parse services. Nor do they require having a Parse or Facebook developer account"Boltss' github

[[object saveAsync:obj] continueWithBlock:^id(BFTask *task) { 
    if (task.isCancelled) { 
    // the save was cancelled. 
    } else if (task.error) { 
    // the save failed. 
    } else { 
    // the object was saved successfully. 
    SaveResult *saveResult = task.result; 
    } 
    return nil; 
}]; 

現在,我得到的困惑,Is bolts framework need to use parse webservice?

注:不要問你想用螺栓的框架。看到我這個問題的第一行。

+0

沒有,你可以使用解析僅僅使用解析SDK。不需要額外的框架。 – rist

+0

我的朋友,第一次看完我的問題。然後問問題。我想在沒有解析框架的幫助下使用螺栓框架。這是否需要使用解析框架? – Mani

+0

我的朋友,首先閱讀Bolts的文檔:「使用這些庫不需要使用任何Parse服務。「https://github.com/BoltsFramework/Bolts-iOS – rist

回答

1

當然,它不需要解析web服務。我在執行自己的任務時遇到同樣的困難,我正在研究這個框架。看看BoltsTest code:你可以找到一些有用的代碼。

我想在一個示例項目(https://github.com/giaesp/BoltsFrameworkSample)中進行一些實驗。基本上你需要定義你自己的方法返回一個BFTask。這裏有一個簡單的摘錄。

- (BFTask*) parseHTML:(NSURL*)url searchString:(NSString*)searchString { 
BFTaskCompletionSource * tcs = [BFTaskCompletionSource taskCompletionSource]; 

NSURLRequest * request = [NSURLRequest requestWithURL:url 
              cachePolicy:NSURLRequestReloadIgnoringLocalCacheData 
             timeoutInterval:30]; 
NSURLResponse * response; 
NSError * error; 
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
if (!error) { 
    NSString * receivedData = [NSString stringWithUTF8String:[returnData bytes]]; 
    NSUInteger occurrences = [self countOccurencesOfString:@"iOS" inputString:receivedData]; 
    [tcs setResult:[NSNumber numberWithInt:occurrences]]; 


} 
else { 
    [tcs setError:error]; 
} 

return tcs.task; 
} 

然後,您可以使用您的方法作爲文檔解釋並檢查任務狀態。

[[self parseHTML:[NSURL URLWithString:@"http://www.stackoverflow.com"]] continueWithBlock:^id(BFTask *task) { 
if (task.isCancelled) { 
    // the task was cancelled 
} else if (task.error) { 
    // the task failed 
} else { 
    // the task completes 
} 
return nil; 
}]; 
+0

如果你可以給出一個有用的代碼的例子,而不是僅僅鏈接到它,這將是有幫助的。 – cpburnz

+0

是否有可能將此框架與第三方框架一起使用,用於Web服務,如ASHTTP或AFNetworking?我在想你所發佈的內容。但我已經用AFNetwork編寫了Web服務。是否有可能將螺栓與之相結合?或者這個框架必須用於其他嗎? – Mani

+0

您的示例代碼非常有用。但我認爲,這裏缺少一些東西。我在上面寫的與Async操作無關的代碼中看不到代碼。你可以用Async操作解釋你的代碼嗎?無論如何+1給你?我認爲,這是開始螺栓框架的初始點。 – Mani

0

螺栓的想法是使用BFTask封裝任何操作。你不一定要在包裝的方法操作,但它的想象,你如何組織你的代碼的好方法:

- (BFTask*) asynchronousImageProcessOperation; 
- (BFTask*) asynchronousNetworkOperation; 

......而所有這些將遵循類似的模式:

- (BFTask*) asynchronousNetworkOperation { 
    BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; 

    // ... here's the code that does some asynchronous operation on another thread/queue 
    [someAsyncTask completeWithBlock:^(id response, NSError *error) { 
    error ? [source setError:error] : [source setResult:response]; 
    } 

    return task; 
} 

它的美妙之處在於你可以將這些任務以某種方式串聯起來。例如,如果你需要處理的圖像,然後上傳它,你可以這樣做:

[[object methodReturnImageProcessingTask] continueWithBlock:^(BFTask *task) { 
    [[anotherObject imageUploadTaskForImage:task.result] continueWithBlock:^(BFTask *task) { 
    self.label.text = @"Processing and image complete"; 
    }] 
}] 

當然,你也可以封裝在其自己的任務兩階段任務:

- (BFTask*) processAndUploadImage:(UIImage* image); 

打字從記憶這裏。這是非常強大的排序和分組。偉大的框架。

+0

謝謝itsthejb。您上面已經嘗試過,是在完成異步任務而不是在異步任務期間使用BFTask處理的?我對嗎?我想知道,如何在異步任務中使用BFTask,特別是使用BFTask鎖定和解鎖資源的位置? – Mani

+0

例如:假設您想要加載AssertLibrary中的所有圖像,並在加載時將所有圖像的大小調整爲標準大小,因此如果對主線程執行操作,則會觸發它。在這個地方,如果你使用異步操作方式,如何使用BFTask呢?另一個例子。有一次,您試圖將10個webservice與異步操作並行調用,您如何使用GCD和BFTask? – Mani

1

我知道這已經有一段時間了,因爲這個問題被問到,但是作爲mani想知道你是否可以使用AFNetworking的Bolts框架以及我想添加一個快速示例來顯示使用情況。
這是寫在迅速,真的只是簡單明瞭。

func taskWithPath(path: String) -> BFTask { 

    let task = BFTaskCompletionSource() 
    AFHTTPRequestOperationManager().GET(path, parameters: nil, success: { (operation, response) in 
     task.setResult(response) 

    }) { (operation, error) -> Void in 
     task.setError(error) 
    } 
    return task.task 
} 

希望這有助於:)